mysql 中的 round 工作得不太好

发布于 2024-11-17 23:17:35 字数 546 浏览 1 评论 0原文

round 函数有时不能很好地工作。我的数据库中有这样的一行:

field_1= 375
field_2= 0.65
field_3= 0.1 
field_4= 11

所以我们知道: field_1*field_2*field_3*field_4 = 268.125 所以如果我将其四舍五入到 2 位小数 -> 268.13。

但在 mysql 中我得到 268.12 ->从我的表中选择 round(field_1*field_2*field_3*field_4) -> 268.12

这种情况只会发生在这些值上,我尝试使用其他数字,这一轮工作没有问题。

关于它的任何解决方法。我在 mysql 4.1.22 和 5.1.44 中尝试过,但遇到了同样的问题。我在其他论坛中阅读 http://bugs.mysql.com/bug.php?id= 6251 认为这不是一个错误,他们说这取决于 C 库的实现。

The round function sometime doesn't work very well. I have in my db a row like this:

field_1= 375
field_2= 0.65
field_3= 0.1 
field_4= 11

So we know that: field_1*field_2*field_3*field_4 = 268.125 so if I round it to 2 decimals -> 268.13.

But in mysql I got 268.12 -> Select round(field_1*field_2*field_3*field_4) from my table -> 268.12

This situation just happens with these values, I tried with other numbers and no problem the round works.

Any workaround about it. I tried in mysql 4.1.22, and 5.1.44 and I get the same issue. I read in other forum http://bugs.mysql.com/bug.php?id=6251 that it is not a bug, they said that it depends on the C library implementation.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

诗酒趁年少 2024-11-24 23:17:35

这些列使用什么数据类型?

如果您想要精确的精度,那么您应该使用 NUMERICDECIMAL,而不是 FLOATREAL

来自手册

The DECIMAL and NUMERIC types store exact numeric data values. 
These types are used when it is important to preserve exact precision, 
for example with monetary data. 

What data type are you using for those columns?

If you want exact precision then you should use NUMERIC or DECIMAL, not FLOAT, REAL, or DOUBLE.

From the manual:

The DECIMAL and NUMERIC types store exact numeric data values. 
These types are used when it is important to preserve exact precision, 
for example with monetary data. 
哽咽笑 2024-11-24 23:17:35

如果适用,您可以使用 FLOOR()

如果不适用,您最好在应用程序端处理此问题。即对应用程序端进行整个计算,然后进行舍入,或者仅对应用程序端进行舍入。

从我的表中选择 (field_1*field_2*field_3*field_4) AS myCalculation

If applicable you can use FLOOR()

If not applicable you will be better off handling this on the application side. I.e. do the entire calculation application side and then round, or just round application side.

SELECT (field_1*field_2*field_3*field_4) AS myCalculation FROM my table

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文