从数字

时间:2017-12-20 18:55:18

标签: php

我已经说过0.000010040.00001

我正在尝试选择以及如何修剪小数位并将其转为两者,以便两次都返回0.00001

希望它无论如何都要对数字进行舍入。

我已经尝试过了,但它没有给我预期的结果。

function decimalFix($number, $decimals) { 
   return floatval(bcdiv($number, 1, $decimals)); 
}

echo decimalFix(0.00001, 5); // returns "0"

有谁知道我能做什么?我不能涉及任何舍入,我需要它将它作为浮点而不是字符串返回。

2 个答案:

答案 0 :(得分:1)

我不知道为什么你会如此致力于失去精确度,但是这里有一些数学能够以你希望的方式犯这个错误。

$derp = 0.000016;

function derp_round($derp, $len) {
    $mul = pow(10, $len);
    return floor($derp * $mul)/$mul;
}

var_dump(
    $derp,
    number_format($derp, 5),
    sprintf("%.5f", $derp),
    sprintf("%.5f", round($derp, 5, PHP_ROUND_HALF_DOWN)),
    sprintf("%.5f", derp_round($derp, 5))
);

输出:

float(1.6E-5)
string(7) "0.00002"
string(7) "0.00002"
string(7) "0.00002"
string(7) "0.00001"

答案 1 :(得分:0)

floor()的PHP文档的first comment中有一个完全的函数。我会把它复制在这里以防它从那里消失,但是积分可以转到seppili _:

function floordec($zahl,$decimals=2){    
     return floor($zahl*pow(10,$decimals))/pow(10,$decimals);
}

使用它像:

$number = 0.00001004;

$rounded = floordec($number, 5);
var_dump($rounded); // float(0.00001)

修改:Leon Grdic在该页面上发表评论further down警告浮动精度并提供此更新版本:

function floordec($value,$decimals=2){    
    return floor($value*pow(10,$decimals)+0.5)/pow(10,$decimals);
}

用法是一样的。