为了账号安全,请及时绑定邮箱和手机立即绑定

数字左侧零的情况下的精度问题

数字左侧零的情况下的精度问题

PHP
翻阅古今 2021-05-07 18:16:32
我的功能如下:static function applyPrecision($vals) {        $originalNumber = $vals['reading'];        if (is_numeric($originalNumber)) {            $precision = ($vals['precision'] != '' || $vals['precision'] != 0) ? $vals['precision'] : 4;            $factor = pow(10, $precision);            $multipliedNumber = $originalNumber * $factor;            //$integerMultipliedNumber = floor($multipliedNumber);            $var = explode(".", $multipliedNumber);            $integerMultipliedNumber = $var[0];            return $result = (float) ($integerMultipliedNumber / $factor);        } else {            return $originalNumber;        }    }使用此方法,我们可以对数字应用精度,而无需四舍五入,例如:-给定45.12345678精度为3,则输出为45.123但是,如果像这样的数字:: 45.1000000,精度为3,则输出仅像45.1一样,零被跳过了,有什么办法可以避免这种情况吗?
查看完整描述

2 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

如果这是关于浮点数的问题,则14.1与14.100相同。如果这是关于字符串的问题,那么您应该只使用substr()。在下面的答案中,$number要删减的$precision位数是多少,要保留的小数位数是多少。


$number = (string) $number;

$temp = $precision <= 0 ? 0 : $precision+1;

return substr($number, 0, strrpos($number, '.') + $temp);


查看完整回答
反对 回复 2021-05-14
?
喵喔喔

TA贡献1735条经验 获得超5个赞

为了获得浮点数的前3个子位数而不进行舍入,您必须使用,float($number*1000/1000)然后将其与number_format(float($number*1000/1000),3)


例子


$var =0.35489;

$var2 = number_format(floor($var * 1000) / 1000,3);

echo $var2;

输出


0.354


例子2


$var =0.3000;

$var2 = number_format(floor($var * 1000) / 1000,3);

echo $var2;

输出2


0.300


如果您的精度是可变的,那么您将不得不使用 pow(10,$precision)


范例3


$var =0.3000;

$precision =3;

$var2 = number_format(floor($var * pow(10,$precision)) / pow(10,$precision),3);

输出3


0.300


查看完整回答
反对 回复 2021-05-14
  • 2 回答
  • 0 关注
  • 143 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信