问题:
我需要的是一种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
答案 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
或$min
5:
0.0000000000000000000000000000000000000000000000000000000010000
0.00212
0.000000000010000
2.11765
999.00000
0.10000
0.00000
0.00000
0.00000
答案 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和点,然后匹配下一位或两位数字。