84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
numfmt_format_currency(new NumberFormatter('en',2), 31.005, "USD") This code outputs $31.00. But it should output $31.01. How to resolve this issue???这段代码输出的是$31.00。但应该输出$31.01。如何解决这个问题??
numfmt_format_currency(new NumberFormatter('en',2), 31.005, "USD")
PHP在价格格式方面无视将0.005转换成0.01。
我尝试修复Magento的货币格式问题,但在PHP方面找到问题
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中对它们进行格式化时,您会遇到相同的问题。
31.005实际上在两个数字之间,请查看https://php.net/float上的浮点精度。
(在PHP和其他语言中,没有31.005这个数字。.)
你需要提供足够精度的数字,但要尽可能少地出现误差,以匹配你的显示要求。这可以通过指定舍入模式来实现,例如,如果你想将31.005四舍五入到31.01,你可以选择向上舍入或向下舍入。
这就是droopsnoot评论的内容
数字格式化默认模式和创建
如Olivier在评论中提醒的那样,默认模式是半偶数舍入,也称为银行家舍入。
同时,他们指出使用类常量NumberFormatter::CURRENCY会“更加规范”,而不是使用魔术数字2
这将使您的代码更好地进行通信,否则数字2可能会被解读为数字的位数或精度,但在这种情况下并非如此。您可以在PHP手册中找到所有的样式常量。
备注:这并不只是PHP特有的问题,当您将这些数字传递给Javascript并且需要在Javascript中对它们进行格式化时,您会遇到相同的问题。