// php 8.0 - 8.2 // floatval 函数用于获取变量的浮点值 // intval() 函数用于获取变量的整数值。 php -r 'echo floatval("2.51");' >> 2.51 php -r 'echo floatval(2.51);' >>2.51 php -r 'echo intval(251);' >> 251 php -r 'echo intval("251");' >> 251 php -r 'echo floatval("2.51")*100;' >> 251 php -r 'echo floatval(2.51)*100;' >> 251 // bug 来了 floatval("2.51")*100 根据上面可知是 251 ,也可知 intval(251)===251 php -r 'echo (int)( floatval("2.51")*100 );' >> 250 php -r 'echo intval( floatval("2.51")*100 );' >>250
1 Worldispow 2023-07-08 23:00:19 +08:00 via Android |
![]() | 2 churchill 2023-07-08 23:01:53 +08:00 不算 bug 吧 大部分语言的取整实现都是 truncate towards zero 250.999999 ~取整可不就是 250 嘛 |
![]() | 3 veike 2023-07-09 01:37:35 +08:00 php -r 'echo (int) bcmul("2.51", "100");' 结果为 251 |
![]() | 4 mingl0280 2023-07-09 08:02:41 +08:00 建议楼主回去复习 IEEE-754 浮点数。 这属于浮点数的基本知识了,浮点数不是精确等于某个值的。 |
![]() | 5 darkengine 2023-07-09 10:02:19 +08:00 不是语言的问题,基本上每个平台/语言都会遇到 |
6 NessajCN 2023-07-09 10:13:35 +08:00 Python: >>gt; 2.51*100 250.99999999999997 NodeJS: > 2.51*100 250.99999999999997 另外楼主可以试试经典的 0.1+0.2 |
![]() | 7 lysS 2023-07-09 11:14:45 +08:00 0.251 应该不能用那几位二进制精确表示,用的是近似值 |
8 llh880808 2023-07-09 15:19:31 +08:00 浮点数的表达范围为什么能远远大于整型数,这一定是有取舍的,舍去的就是精度 浮点数的特点是在 0 附近的精度相当高,越靠近±无穷大精度就越差,可以想象当数字大到一定程度,(浮点数)连整数的精度都保证不了 因此不要预期 2.51 (更靠近 0 )和 251 会有完全一致的行为 |
9 zhangtest 2023-07-09 17:34:16 +08:00 php 计算相关的用这个 https://www.php.net/manual/zh/ref.bc.php |
![]() | 10 well775397252 2023-07-09 20:03:07 +08:00 不是 bug |
11 woojanelook 2023-07-10 10:39:44 +08:00 php 涉及浮点计算的都要使用 bc 函数 |
![]() | 12 Symo 2023-07-10 11:03:06 +08:00 浮点数的 round floor ceil 还是通过 bcmath 的方式显式指定,依赖默认转换很容易出问题 |