我需要帮助。我正在这样做:
round($myvar,2);
我得到的号码是:9.77999999999999999€
与其他变量它工作得很好,任何想法如何解决这个问题?
我这样做了:
<?php echo round(9.7752,2);?>
我得到:9.77999999999999999
我相信这是php.ini中的东西,就像@MarkBaker说的…但是,我通过这样做来修复它:
<?php echo number_format($myvar,2);
我得到了我想要的。谢谢大家的帮助!
在round函数前加入空字符串,就像
$val = "" . round(9.597466245, 2);
我遇到的问题是(18.203,2)= 18.2,那么json_encode(…)= 18.199999999。所以我发现解决方案是json_encode(strval(round(18.203,2))) = 18.2它是
一些东西(可能是在一些第三方代码?)设置您的ini设置precision
为16
$php -a
php > echo ini_get("precision");
14 // default
php > echo round(9.7752,2);
9.78
php > echo ini_set("precision", 16);
14
php > echo round(9.7752,2);
9.779999999999999
将结果用浮点数封装
floatval(round($myvar,2));
如果使用number_format
, 必须加上后面的两个参数,否则更大的数字会出错:
number_format($myvar,2, '.', '');
告诉PHP使用"."作为小数分隔符,没有千位分隔符
虽然OP解决了他的问题,但我在搜索其他(但类似的)问题时看到了这个
如果你来这里有一个问题,PHP的round()
函数行为不当(即round(1.4447, 2)
将输出1.44
而不是1.45
),这是因为round看起来只是1小数点后的精度,这里有一个小的递归辅助函数,解决了这个问题:
function roundFloat($float, $neededPrecision, $startAt = 7)
{
if ($neededPrecision < $startAt) {
$startAt--;
$newFloat = round($float, $startAt);
return roundFloat($newFloat, $neededPrecision, $startAt);
}
return $float;
}
使用例子:
roundFloat(1.4447, 2, 5); // Returns 1.45
解释:
- 在上面的例子中,它从小数点后5位(
0
)开始舍入,因为没有另外说明。 - 您可以使用相同的方法调用
roundFloat(1.4447, 2, 15)
这样的函数给定浮点数1.4447
的结果。 -
$startAt
只定义了"舍入过程"或所需精度的起点。
注意:所有的编程语言都有精确写浮点数的问题(与二进制有关,谷歌更多信息)。
希望对大家有所帮助。
我有同样的问题和我的解决方法(为了不改变ini-file,可能会破坏其他东西):
$rounded = bcdiv($number, 1, 2);
结合@PabloCamara的回答和@LorienBrune的评论,这个解决方案对我有效:
function roundFixed($number, $decimalPlaces)
{
return str_replace(',', '', number_format($number, $decimalPlaces));
}