選擇在小數點後附加數字的查詢。 該列的數據類型是十進制(4,2)。 存儲的值是1.39,但我得到的是1.3899999999999999。小數點後的附加數字
我可以在PHP中執行round,number_format但是有沒有辦法在十進制後沒有額外數字的情況下獲得精確值?
數據庫是MSSQL。
選擇在小數點後附加數字的查詢。 該列的數據類型是十進制(4,2)。 存儲的值是1.39,但我得到的是1.3899999999999999。小數點後的附加數字
我可以在PHP中執行round,number_format但是有沒有辦法在十進制後沒有額外數字的情況下獲得精確值?
數據庫是MSSQL。
很可能您的數據庫庫在後臺將DECIMAL(4, 2)
數據類型轉換爲float
。現在的1.39
不能完全表示爲浮點數,而是近似爲1.3899999999999999023003738329862244427204132080078125
(使用online converter或做一個<?php ini_set("precision", 99); var_dump(1.39);
)。
有一些解決方法,最簡單的是將十進制數轉換爲字符串在查詢級別:
SELECT CAST(col AS VARCHAR(4)) AS col_as_string FROM ...
另一個解決辦法是使用number_format
功能,這似乎是圓的值。
我懷疑1.39不能完全表示爲浮動。
我不知道PHP,所以這裏是一些Java代碼來演示:
class DoubleFloat {
public static void main(String[] args) {
float f = 1.39f;
double d = 1.39f;
System.out.println("f = " + f);
System.out.println("d = " + d);
}
}
輸出:
f = 1.39
d = 1.3899999856948853
取決於你試圖在PHP端做的,但你可以將數字存儲爲整數,例如1.39被存儲爲139,並在PHP端將其轉換爲。
請注意PHP對於帶小數點的數字沒有精確的數據類型。使用這些數字時,它將始終使用近似數據類型(浮點數)。
因此,將0.1 + 0.2與0.3比較可能很可能導致false
。這意味着:小心平等比較。
顯示此類值時,不應該依賴默認演示文稿,而應使用number_format
。例如。 number_format($value, 2)
。
如果您想完全避免浮點問題,那麼請不要使用帶小數點的數字。雖然這可能很麻煩(例如,檢索1.39的整數139並記住該值意味着百分之一)。
目標變量數據類型? – jarlh
我正在使用php5.6 ...所以沒有指定明確的數據類型。 –
SELECT ROUND(1.3899999999999999,2) – Chanukya