将数字四舍五入为小数位数n

时间:2018-07-15 05:24:40

标签: php decimal rounding

问题:

我需要的是一种PHP方式或函数,将带有可变小数位数的数字四舍五入为与成本计算相关的值。

知道产品成本为0.00023123414123美元/克是没有道理的,而0.00023美元/克会导致非常相似的实际成本。当处理少量物体时,过于精确是低效的。我无法支付0.000231234141美元,除非我购买的重量超过1000公斤,否则0.000231234141不会好于0.000231

上下文:

我正在为一个餐馆项目工作,我需要计算产品成本并将结果显示为单价。事实是,取决于用户选择的单位,结果可能是0.25 USD / kg或0.00025 USD / g。所以我不能使用round($ var,2),因为我不知道会有多少小数位

我将价格和金额存储在数据库的不同列中,并且仅执行数学运算以显示结果

使其负责:

让我们假设用户以36美元的价格购买了17公斤鸡并将其支出记录在数据库中。产品的成本约为$ 36 / 17kg = 2.117647058 USD / kg,到目前为止,我可以说是2.11 USD / kg。但是现在,如果用户想知道产品的成本/克,那么是否用相同的数学公式(在本例中为代码)将产品的货币/金额相除,我将得出$ 36 / 17000g = 0.002117647058这显然不能四舍五入到小数位数与第一种情况相同。

因此,我需要一种始终将结果四舍五入为整数的方法。

例如:

0.002117647058 => 0.0021

2.117647058 => 2.12

2 个答案:

答案 0 :(得分:2)

您可以创建一个查找0.n的函数,然后返回迭代值+ $min

<?php
/**
 * Get the decimals value
 * 
 * @param $value
 * @param $min  - min decimals
 * @return int
 */
function get_decimals($value = 0, $min = 2) {
    if ($value === '0.00') {
        return $min;
    }
    for ($i = strlen($value); $i >= $min; $i--) {
        if (strstr($value, '0.'.str_repeat('0', $i), true) !== false) {
            return $i+$min;
        }
    }
    return $min;
}

因此get_float('0.002117647058')将返回4,然后可以将其以数字格式使用。

例如:

$values = [
    '0.000000000000000000000000000000000000000000000000000000001', # ¯\_(ツ)_/¯
    '0.002117647058',
    '0.00000000001',
    '2.117647058',
    '999.0',
    '0.1',
    '0.00',
    '0.0',
    '0'
];

foreach ($values as $value) {
    echo number_format($value, get_decimals($value)).PHP_EOL;
}

结果:

0.0000000000000000000000000000000000000000000000000000000010
0.0021
0.000000000010
2.12
999.00
0.10
0.00
0.00
0.00

https://3v4l.org/bmMNe

$min 5:

0.0000000000000000000000000000000000000000000000000000000010000
0.00212
0.000000000010000
2.11765
999.00000
0.10000
0.00000
0.00000
0.00000

https://3v4l.org/eD7Gi

答案 1 :(得分:1)

如果数字> 1,则可以使用round;如果数字较小,则可以使用regex。

$num = [2.117647058, 0.002117647058];

foreach($num as $n){
    if(substr($n,0,1) > 0){
        echo round($n, 2) . "\n";
    }else{
        preg_match("/([0\.]+)(\d{1,2})/", $n, $m);
        echo $m[0] . "\n";
    }
}

正则表达式模式匹配0和点,然后匹配下一位或两位数字。

https://3v4l.org/UJ6W1