我需要帮助。我这样做:
round($myvar,2);
这是我得到的数字:9.779999999999999€
使用其他变量它可以正常工作,任何想法如何解决这个问题?
答案 0 :(得分:10)
我这样做了:
<?php echo round(9.7752,2);?>
我得到了:9.779999999999999
我相信它是php.ini中的东西,因为@MarkBaker说.. 但是,我通过这样做来修复它:
<?php echo number_format($myvar,2);
我得到了我想要的东西。 谢谢大家的帮助!
答案 1 :(得分:3)
在round函数之前加入空字符串就像
$val = "" . round(9.597466245, 2);
答案 2 :(得分: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
答案 3 :(得分:1)
我遇到的问题是圆形(18.203,2)= 18.2,然后是json_encode(...)= 18.199999999。 所以我发现解决方案是json_encode(strval(round(18.203,2)))= 18.2 它的工作原理
答案 4 :(得分:0)
虽然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
说明:
0
)开始舍入,因为没有另外说明。 roundFloat(1.4447, 2, 15)
一样调用这个函数
给定浮点1.4447
的结果。 $startAt
只定义“舍入过程”的起点或所需的精度。注意:所有编程语言都有精确编写一些浮点数的问题(与二进制文件有关,谷歌有更多信息)。
希望它有所帮助。
答案 5 :(得分:0)
我遇到了同样的问题和解决方法(为了不更改ini文件并可能破坏其他内容):
$ rounded = bcdiv($ number,1,2);
答案 6 :(得分:0)
结合@PabloCamara的回答和@LorienBrune的评论,此解决方案对我有用:
function roundFixed($number, $decimalPlaces)
{
return str_replace(',', '', number_format($number, $decimalPlaces));
}
答案 7 :(得分:0)
只需将结果封装在 floatval 中
floatval(round($myvar,2));
如果使用 number_format
,则必须添加接下来的两个参数,否则较大的数字会出错:
number_format($myvar,2, '.', '');
这告诉 PHP 使用“.”作为小数点分隔符,没有千位分隔符。