我的表格包含列float(10,5)
和decimal(10,5)
我将表更新为:
update table1
set decimaltesting = 12311123123123123.456789,
floattesting = 12311123123123123.456789;
结果变为:
decimal = 99999.99999
float = 100000.00000
但如果我将列更改为float(6,3)
和decimal(6,3)
并使用与上面相同的值更新
结果变为:
float = 999.999
decimal = 999.999
为什么对于第一种情况,浮点值将为100000.00000
?
答案 0 :(得分:2)
垃圾进入 - 垃圾出局
记住这个简单的规则。在通常情况下,您的语句将不正确 - 例如,因为严格的sql模式,它将失败并出现错误。但是,既然你正如你所描述的那样得到结果,我认为你已经允许这样的行为了。正确的观点是 - 你的应用程序知道关于它的模型数据类型 - 所以这些东西都在控制之下 - 并且你不会将垃圾传递给你的DBMS,结果也是垃圾。
始终关注精确度
您的示例是一个很好的演示 - 定点数据类型和浮点数据类型之间的区别。第一件事 - 根据manual page:
为浮点或定点列分配值时 超出指定(或默认)精度所暗示的范围 scale,MySQL存储表示相应端点的值 该范围。
- 这就是为什么你会看到999.999
等等。但是 - 奇怪的100000.00000
怎么样?提示是 - 你只能看到浮点字段。为什么?因为MySQL会将您的超出范围的值转换为您的字段允许的最大值,但是,由于浮点值大致存储,因此no guarantee最终值将保持精度 - 因此,它可能会导致您的100000.00000
值。{{1}}请注意,对于定点数据类型,这种情况永远不会发生。