Php 整数到n个小数

Php 整数到n个小数,php,decimal,rounding,Php,Decimal,Rounding,问题: $values = [ '0.000000000000000000000000000000000000000000000000000000001', # ¯\_(ツ)_/¯ '0.002117647058', '0.00000000001', '2.117647058', '999.0', '0.1', '0.00', '0.0', '0' ]; foreach ($values as $value) {

问题:

$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
我需要的是PHP中的一种方法或一个函数,将一个具有可变小数量的数字四舍五入到一个与成本计算相关的值

知道产品成本为0.000231234123 USD/g是没有意义的,相反,0.00023 USD/g会导致非常相似、更实际的成本。当处理少量的东西时,过于精确是低效的。我不能支付0.00023123414美元买东西,除非我买的东西超过1000公斤,否则0.00023123414并不比0.000231好

上下文:

$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
我正在为一家餐厅做一个项目,我需要计算产品成本,并将结果显示为价格/单位。问题是,根据用户选择的单位,结果可能是0.25 USD/kg或0.00025 USD/g。所以我不能使用round($var,2),因为我不知道需要多少小数

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

让它负责:

$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
假设用户以36美元的价格购买17公斤鸡肉,并将费用记录在DB中。该产品的成本约为36美元/17kg=2.117647058美元/kg,我可以将其四舍五入为2.11美元/kg,到目前为止还不错。但是现在,如果用户想知道产品的成本/克,那么是相同的数学(在本例中是代码)除以产品的钱/量,I将有$36/17000g=0.002117647058,很明显,它不能四舍五入到与第一种情况相同的小数量

所以我需要一种方法来将结果四舍五入到一个干净的数字

例如:

0.002117647058=>0.0021


2.117647058=>2.12

如果数字大于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和点,然后匹配后面的一个或两个数字


您可以创建一个函数,该函数查找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;
}
结果:

$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

$min
5:

0.0000000000000000000000000000000000000000000000000000000010000
0.00212
0.000000000010000
2.11765
999.00000
0.10000
0.00000
0.00000
0.00000

这个问题需要努力才能回答。不要进行取整和存储,取整只显示在屏幕上(存储准确的值),然后您可以无问题地反转,再加上一年多的时间up@LawrenceCherone,谢谢,我编辑了这个问题:我将价格和金额存储在数据库的不同列中,并只为显示结果进行计算。贷款几乎从不干净,不管他们有多少位数。@IgnacioVazquez Abrams我知道,我只需要在显示数字之前去掉多余的小数。这个项目是为一个小的,当地的企业,所以他们没有花费数百万多拉,因此一个极端准确的数字在实践中是没有意义的。