数字左边为零时的精度问题

时间:2019-04-24 11:16:13

标签: php precision

我的功能如下:

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 个答案:

答案 0 :(得分:0)

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

$number = (string) $number;
$temp = $precision <= 0 ? 0 : $precision+1;
return substr($number, 0, strrpos($number, '.') + $temp);

答案 1 :(得分:0)

要获取浮点数的前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

example2

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

output2

0.300

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

Example3

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

output3

0.300