日期:2014-05-17  浏览次数:20545 次

太奇怪的问题了,1个(64->99)*1加上10个(0.01*1)不等于xx.1
前些天测试人员告诉我订单金额这有问题。测试数据一订单有一个90的,10个1分的。Price float,count int。

于是我测了下在数据库,第一个90,剩下10个0.01。
SELECT SUM(Price * Count) FROM Orders WHERE OrderID = 201211220002 
结果为 90.1000000000001。
但是前10个0.01,最后一个90。结果正常是 90.1。

我又测了其他数,64-99都会出现这问题。其他正常。

虽然我在程序里控制金额显示。但是数据库这问题太奇怪了。
------解决方案--------------------
float是非精确数据类型,所以最好要先限定小数位再运算
------解决方案--------------------
float [ ( n ) ]
其中 n 为用于存储 float 数值尾数的位数(以科学记数法表示),因此可以确定精度和存储大小。如果指定了 n,则它必须是介于 1 和 53 之间的某个值。n 的默认值为 53。

n value  精度  存储大小  
1-24 
 7 位数
 4 字节
 
25-53 
 15 位数
 8 字节
 
这些是联机丛书上的,也就是说如果你float不指定n,那默认会精确到15位
------解决方案--------------------
有类似情况,单价为float,特别是拆分的物品(如药品中的片剂)拆分后的单价在做计算时先decimal或numeric限定小数位数