问题是这样的,当我从一个表中添加两个或多个双打到一个视图时,它没有给我正确的结果,而是增加了大约十个左右的数字。例如 0.5+1.5=1.99999999998 或 5.5+8.5=14.0000000001。有任何想法吗?(我知道这是一个 n00b 问题,我记得在 9 年级的考试中不得不处理类似的事情,但我只是不记得当时我是如何做到的:P)
6 回答
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_format
如果那是你的追求,你可以用这种方式格式化数字?
将 1 和 1 添加为浮点数或双精度数不应产生除 2 之外的任何结果。
我很难相信 0.5 + 1.5 除了 2 之外的任何结果。
所有这些数字都可以用二进制浮点数正确表示。
我不想说我不相信你的例子,但我不相信。:-)
但是,我相信您可能会遇到像 1.1 这样的数字的问题。
为什么?因为 1/10 原来是二进制的重复小数。
尝试在十进制和二进制表示之间转换浮点数时出现问题。一些数字使旅行很好,但其他数字只是近似值。
但是,如果您的示例真的像那样工作,我不知道发生了什么,我很想知道。
浮点数始终只是近似值。:-) 如果精度很重要,请找出使用整数的方法。
根据我的经验,当我使用十进制数据类型而不是浮点/双精度时,我总是得到精确的结果。
这篇文章很好地解释了这个问题。
简而言之,非常大或非常小的浮点数都可能导致计算过程中的精度损失。
使用浮点类型时不要指望整数。
不确定您是在寻找解释还是解决方案,但是因为您已经获得了指向良好解释的指针....
如果您需要您的数字表现得像整数,请使用整数。如果您需要有限的精度(即,对于代表金钱的字段,保留两位小数),无论如何将其存储为整数,但将其乘以任何需要的 10 倍数,以便在将其放入时去掉小数点数据库并在您将其拉出时除以相同的值。
因此,如果您代表一个成本为 3.99 美元的小部件,则将 399 放入 WIDGET.cost 字段。
不知道这是否适用于您的情况。但一般的经验法则是浮点数始终只是近似值。:-) 如果精度很重要,请找出使用整数的方法。