2017-06-08 61 views
-1

下面的sprinf行爲很奇怪。PHP sprintf('%d',floatval('16 .40')* 100)輸出1639?

// The code below outputs 1639 
$value = floatval('16.40') * 100; 
echo sprintf('%d', $value); 

但是當我使用它%f輸出1640.000000

我甩了$value,這絕對是float(1640)

有沒有人知道當我使用%d時發生了什麼?這是一個PHP錯誤?我已經在PHP7中測試過了。

+1

[PHP - 浮點數精度]的可能重複(https://stackoverflow.com/questions/3726721/php-floating-number-precision) –

回答

3

變量$value包含一個浮點數。浮點數不準確,它們是近似值。

$value的值不是1640而是1639.99999999999977262632。當您使用%f進行打印時,printf()將其舍入爲小數位數6,舍入值爲1640.000000

當使用%d打印時,printf()只使用$value的整數部分,它是1639

使用round()以得到正確的整數值:

printf('%d', round($value, 0)); 

,或者甚至更好,使用number_format()獲得價值爲字符串:

echo(number_format($value, 0, '', '')); 

兩個打印1640


1/3思考。它近似於0.3333333333,但不能完全表示它,因爲它在小數點後有無限數量的3。在數學中,3 * 1/3 = 1但在現實生活中(和電腦中),3 * 0.333333333絕不是1,不管我們在小數點後面加了多少個3。計算機程序通常將該值舍入到小數位數,最後顯示爲1,但這並不總是會發生。

當它沒有發生時,另一個question similar to this one彈出在StackOverflow上。

+0

感謝您的答案!現在很清楚。 – Jonathan