PHP 什么情况下 5.590 小于 5.59

2017-07-26 16:51:34 +08:00
 solaro

上图实际开发业务中,碰到了个坑,

数据库用的 mysql 左边 5.590 在数据库中存储是 decimal(10,3) 右边是换算出来的 float

现在 floatval(5.590) < floatval(5.59)

我 sun

4943 次点击
所在节点    PHP
43 条回复
cnfzv
2017-07-26 17:36:29 +08:00
@solaro 同问
ety001
2017-07-26 17:54:37 +08:00
之前用过整数(就是存储到分),后来就用 decimal 了。
oneonesv
2017-07-26 18:00:31 +08:00
浮点数精度不够 可能会有类似 0.111 != 0.111 的情况

PHP 文档 浮点数 章节里面有讲
stabc
2017-07-26 18:01:02 +08:00
谁能说下这种浮点数在计算中常见的坑?
LioMore
2017-07-26 18:06:16 +08:00
请问一下,正确的做法是只用分来计算并使用整数吗?
azh7138m
2017-07-26 18:44:28 +08:00
@LioMore 是的
maypu
2017-07-26 18:49:14 +08:00
算错的时候,哈哈哈哈哈哈
a591826944
2017-07-26 19:54:37 +08:00
LZ 你的心真大。。浮点数算金额。。
a591826944
2017-07-26 19:55:11 +08:00
LZ 你试试 floor(8.29 * 100 * 100 / 100) 的结果 体会一下。。。

这真不是 PHP 的锅、、
bianchensz
2017-07-26 21:11:56 +08:00
233 就算是我老妈用 excel 涉及到钱的都要套个 round 取整,你这也是心大
xzem
2017-07-26 22:10:14 +08:00
被浮点坑过一次,再也不敢用浮点做计算 比较了
blankme
2017-07-26 22:18:51 +08:00
```
if (fabs(a - b) > 1e-3 && a < b)
```
zhx1991
2017-07-26 23:16:42 +08:00
钱用浮点数什么都可能发生

想追究细节的话了解一下计算机怎么表示小数就明白了
stabc
2017-07-26 23:35:50 +08:00
看一下这个明白了:
https://kknews.cc/tech/p8bpz2p.html
incompatible
2017-07-26 23:42:03 +08:00
@LioMore 不是,不要听本帖的草台班子们胡扯用什么 int。正确的方法是用 decimal。
PHP 用户可以看一下 http://de2.php.net/manual/en/ref.bc.php
dikT
2017-07-26 23:48:08 +08:00
现在想想微信的钱 fee 就是按分来存储.当时觉得很奇怪, 恍然大悟[doge]
wsy2220
2017-07-26 23:54:47 +08:00
心真大
msg7086
2017-07-27 00:16:47 +08:00
浮点数大都是不精确的数据存储。
比如 5.59 这个数就无法用浮点数表达,因为在二进制中是个无理数。
LioMore
2017-07-27 00:20:13 +08:00
@incompatible 好的,感谢
solaro
2017-07-27 09:41:38 +08:00
被坑到了。谢谢各位

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/378136

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX