从数字中取出X小数位数

问题描述 投票:-3回答:2

我让我们说0.000010040.00001

我试图选择和小数位数如何修剪和转动这两个所以它返回0.00001两次。

无论如何,我不希望它绕过这个数字。

我试过这个,但它没有给我想要的结果。

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

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

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

php
2个回答
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"

0
投票

有一个函数可以在first comment的PHP文档中的floor()中完成此操作。我会在这里复制它,以防它从那里消失,但是积分转到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);
}

用法是一样的。

© www.soinside.com 2019 - 2024. All rights reserved.