P粉2758839732023-08-09 10:40:33
31.005實際上在兩個數字之間,請查看https://php.net/float上的浮點精度。
> ini_set('precision', 23) = "14" > 31.005 = 31.00499999999999900524
(在PHP和其他語言中,沒有31.005這個數字。.)
#你需要提供足夠精確度的數字,但要盡可能少出現誤差,以符合你的顯示要求。這可以透過指定舍入模式來實現,例如,如果你想將31.005四捨五入到31.01,你可以選擇向上舍入或向下舍入。
#$formatter = new NumberFormatter('en', NumberFormatter::CURRENCY);
$formatter->setAttribute(
NumberFormatter::ROUNDING_MODE,
NumberFormatter::ROUND_HALFUP
);
echo $formatter->formatCurrency(31.005, 'USD'), "\n";
# Output: .01
這就是droopsnoot評論的內容
如Olivier在評論中提醒的那樣,預設模式是半偶數舍入,也稱為銀行家舍入。
同時,他們指出使用類別常數NumberFormatter::CURRENCY會“更規範”,而不是使用魔術數字2
$formatter = new NumberFormatter('en', 2);
$formatter = new NumberFormatter('en', NumberFormatter::CURRENCY);
這將使您的程式碼更好地進行通信,否則數字2可能會被解讀為數字的位數或精度,但在這種情況下並非如此。您可以在PHP手冊中找到所有的樣式常數。
備註:這不只是PHP特有的問題,當您將這些數字傳遞給Javascript並且需要在Javascript中對它們進行格式化時,您會遇到相同的問題。