Postgresql

在 PostgreSQL 中將 float4 轉換為數字是對值進行四捨五入

  • October 5, 2018

我有一個表,其中有一列儲存一些需要高精度的係數。列的類型設置為 float4,我需要將其更改為數字。

但是在更改表之後,它會更改我之前儲存在該列中的值。

例如:0.0199999996 變為 0.0200。

我使用的命令:

ALTER TABLE IF EXISTS table_name ALTER COLUMN column_name TYPE numeric(16, 15) USING column_name::numeric;

關於如何更改列類型但保留以前的值的任何想法?我正在使用 postgresql 10.4

Postgres 手冊(引用如下)很好地解釋了使用浮點類型可能遇到的一些舍入問題。

考慮到這一點,如果我們簡單地接受任何浮點類型的最低有效數字只是近似值,那麼您有幾個轉換選項,包括所有近似的低精度數字。我已經使用float4/float8來與您的問題保持一致,但我們同樣可以使用real/ float。:

select '0.0199999996'::float4;
| 浮動4 |
| :----- |
| 0.02 |
select '0.0199999996'::float4::numeric;
| 數字 |
| ------: |
| 0.02 |
select '0.0199999996'::float4::float8::numeric;
| 數字 |
| -----------------: |
| 0.0199999995529652 |
select '0.0199999996'::float4::text::numeric;
| 數字 |
| ------: |
| 0.02 |
set extra_float_digits = 3;
select '0.0199999996'::float4::text::numeric;
| 數字 |
| -----------: |
| 0.0199999996 |

db<>在這裡擺弄


8.1.3. 浮點類型

數據類型實數和雙精度是不精確的可變精度數值類型。實際上,在底層處理器、作業系統和編譯器支持的範圍內,這些類型通常是二進制浮點算術(分別為單精度和雙精度)的 IEEE 標準 754 的實現。

不精確意味著某些值無法精確轉換為內部格式並儲存為近似值,因此儲存和檢索值可能會顯示出細微的差異。管理這些錯誤以及它們如何通過計算傳播是整個數學和電腦科學分支的主題,這裡將不討論,除了以下幾點:

  • 如果您需要精確的儲存和計算(例如貨幣金額),請改用數字類型。
  • 如果你想用這些類型對任何重要的事情進行複雜的計算,特別是如果你依賴邊界情況下的某些行為(無窮大、下溢),你應該仔細評估實現。
  • 比較兩個浮點值是否相等可能並不總是按預期工作。

引用自:https://dba.stackexchange.com/questions/219276