将十进制数字截取到 2 位,但不应使用 ceil 或 floor 将其四舍五入
Posted
技术标签:
【中文标题】将十进制数字截取到 2 位,但不应使用 ceil 或 floor 将其四舍五入【英文标题】:Cut off decimal numbers to 2 places but should NOT round it using ceil neither floor 【发布时间】:2014-09-30 14:41:50 【问题描述】:我在 php 中有一个涉及 number_format
的问题,我的代码如下所示,
number_format($my_number_with_decimal, 2, '.', ', ');
但是,如果我有一个像 111.115
这样的数字,它将转换为 111.12
,这不是我想要显示的,因为它显然会四舍五入十进制数字。有没有一种解决方法,我可以将十进制数限制为 2,同时它不会向上或向下舍入?请帮忙。提前致谢。
【问题讨论】:
你仍然可以使用 floor(因为你想将 111.119 舍入到 111.11)。只需将您的数字乘以 100,将其取底,然后再除以 100。 【参考方案1】:你想要的在逻辑上是不可能的:
11.11 <= 11.115 <= 11.12
无论您怎么看,将11.115
截断为11.11
都会向下舍入。
【讨论】:
没有。 op 想要缩短/截断值而不改变它们的值,这是不可能的。 是的。刚发帖,我就发现我想多了。 ;) 这就是为什么它消失得一样快。 =P 那么,我不能解决我的问题吗?我不想更改我的数字的值,但当且仅当我的数字的小数点大于 2 时,我想将其切成两(2)个小数点。我只是想把它减少到小数点。 所以使用字符串操作。找出第 3 位以上的小数在哪里并将它们去掉。但请注意,这完全等同于无条件的“向下舍入”操作。您正在从值中删除精度,这也会更改值。 @MarcB,这也是我的想法,但是在我的情况下,数字值的精度是不正确的,尤其是在处理大数字时。这就是为什么我会尽可能地只将其截去两 (2) 位小数。【参考方案2】:如果您只想保留前 2 位数字,请执行以下操作:
floor($my_number_with_decimal * 100) / 100;
这相当于四舍五入。
【讨论】:
【参考方案3】:你可以试试floor()
你可以拥有这个 UDF:
function mine($num,$n=0) //$n is number of decimal places
return (floor($num*(pow(10,$n)))*pow(10,$n));
并称之为:
mine(111.115,2);
应该返回111.11
。
【讨论】:
【参考方案4】:正如@Marc B 指出的那样,截断等于floor
。因此,您可以使用简单的数学来计算特定位数:
echo floor($input * 100) / 100;
请记住,floor
是基于浮点值的,它不是很准确。你可能会在非常大的数字上得到奇怪的结果。 bc
系列函数可以进行浮点数学运算,而无需舍入或取整!
http://php.net/manual/en/function.floor.php
这是一个使用 bc 函数的 floor 函数。如果您有地板问题,请尝试一下。
function floor($number, $prec = 0)
$number = $number * pow(10,$prec);
$number = bcdiv($number, pow(10,$prec), $prec);
return $number;
http://php.net/manual/en/function.bcdiv.php
【讨论】:
【参考方案5】:你知道有多少个整数吗? 假设你这样做,你可以通过切片将其切断。例如,用整数格式的数字说:
$numberWithDecimal = (string)$numberWithDecimal;
$numberWithDecimal = substr($numberWithDecimal, 0, 5);
$numberWithDecimal = (int)$numberWithDecimal;
如果数字已经是字符串格式,你可以这样做:
$numberWithDecimal = substr($numberWithDecimal, 0, 5);
这可能不是最好的或最干净的,也没有经过测试,但我希望能帮上忙。
【讨论】:
【参考方案6】:丑陋的方式:
$number = 111.115;
preg_match('/([^.]*\.\d0,2)/', $number, $match);
echo number_format($match[1], 2, '.', ',');
【讨论】:
以上是关于将十进制数字截取到 2 位,但不应使用 ceil 或 floor 将其四舍五入的主要内容,如果未能解决你的问题,请参考以下文章