将十进制数字截取到 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 将其四舍五入的主要内容,如果未能解决你的问题,请参考以下文章

SQL怎么截取小数点前的数字,但是不要四舍五入

oracle--函数

如何使用正则表达式检查不应包含重复数字的手机号码

Oracle中如何截取字符串的后10位

如何在R中生成随机的64位十六进制数?

无法将除法结果转换为浮点或十进制类型