php floor 取值问题

本文探讨了PHP中浮点数运算导致的精度丢失问题,并通过实例说明如何使用strval转换来避免floor和intval函数带来的误差。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    事情是这样的,在公司有客户反应会少一个进个一位数字,大概类似百度百科这样

<?php
$str=41.23*5000;
echo  floor($str);
echo  "<br>";
echo intval($str);
?>

应该得到206150,为什么他是得到206149呢

解决办法:

可以用strval转一下

原因:

这是计算机内部问题
浮点数的计算永远都不会完全准确
例如 1/3 表示 0.333333...............后面N个3,但是计算时总是会省略后面的3,这就造成了这些现象
例如 
echo "<br>".intval((0.1+0.7)*10);//0.7
echo "<br>".intval(strval((0.1+0.7)*10));//0.8
我是32为系统,结果是这样,但是64为就不清楚了,浮点数在不同系统下精度不一样,结果可能就不一样。可以用strval转一下
你的运算看似206150,其实计算机内部是以206149.99999............的形式存在的,当用floor运算时就会出现你那种现象


转载于:https://my.oschina.net/deacyn/blog/299113

### C++ 中 `floor` 函数的参数范围和返回值限制 #### 参数范围 C++ 的 `floor` 函数支持多种数据类型的输入,具体取决于标准库中定义的不同重载版本。以下是常见的几种形式及其对应的参数范围: - **`float floorf(float arg)`**: 接受单精度浮点数作为参数,其取值范围由系统的 `float` 类型决定,通常为 [-3.4e+38, 3.4e+38]。 - **`double floor(double arg)`**: 接受双精度浮点数作为参数,其取值范围由系统的 `double` 类型决定,通常为 [-1.7e+308, 1.7e+308]。 - **`long double floorl(long double arg)`**: 接受扩展精度浮点数作为参数,其取值范围由系统的 `long double` 类型决定,可能更大。 需要注意的是,如果传入的数值超出了对应类型的有效表示范围,则可能会引发未定义行为或异常[^2]。 #### 返回值限制 尽管 API 文档描述 `floor` 函数计算不大于给定参数的最大整数值,但它并不直接返回整数类型的数据,而是返回与输入相同类型的浮点数值。这意味着即使结果是一个整数值(例如 `floor(5.0)` 将返回 `5.0`),它的实际存储仍然是浮点数格式[^2]。 对于每种重载版本的具体返回值特性如下: - 如果调用了 `floorf(float arg)`,则返回一个 `float` 类型的结果; - 调用 `floor(double arg)` 则返回 `double` 类型; - 使用 `floorl(long double arg)` 则得到 `long double` 类型的结果。 这种设计允许开发者更灵活地处理不同精度需求的应用场景,同时也避免了因隐式类型转换而可能导致的信息丢失问题[^3]。 ```cpp #include <iostream> #include <cmath> int main() { std::cout << "Floor of 2.2 (as float): " << floorf(2.2f) << "\n"; std::cout << "Floor of 2.7 (as double): " << floor(2.7) << "\n"; std::cout << "Floor of -9.9 (as long double): " << floorl(-9.9L) << "\n"; return 0; } ``` 以上代码展示了如何分别利用三种不同的 `floor` 实现来获取相应类型的向下取整结果[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值