2016-11-23 66 views
0

選擇在小數點後附加數字的查詢。 該列的數據類型是十進制(4,2)。 存儲的值是1.39,但我得到的是1.3899999999999999。小數點後的附加數字

我可以在PHP中執行round,number_format但是有沒有辦法在十進制後沒有額外數字的情況下獲得精確值?

數據庫是MSSQL。

+0

目標變量數據類型? – jarlh

+0

我正在使用php5.6 ...所以沒有指定明確的數據類型。 –

+0

SELECT ROUND(1.3899999999999999,2) – Chanukya

回答

1

很可能您的數據庫庫在後臺將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功能,這似乎是圓的值。

0

我懷疑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端將其轉換爲

1

請注意PHP對於帶小數點的數字沒有精確的數據類型。使用這些數字時,它將始終使用近似數據類型(浮點數)。

因此,將0.1 + 0.2與0.3比較可能很可能導致false。這意味着:小心平等比較。

顯示此類值時,不應該依賴默認演示文稿,而應使用number_format。例如。 number_format($value, 2)

如果您想完全避免浮點問題,那麼請不要使用帶小數點的數字。雖然這可能很麻煩(例如,檢索1.39的整數139並記住該值意味着百分之一)。