在用到float类型时,遇到了之前没有关注的【三个雷】。
【雷一】:
在用sqlserver调用其它sqlserver数据库时,对方给我的数据类型是float,但接口文档中说是 Numeric(30,10)类型,于是我就用Numeric(30,10)去接收,导致接收数据错误: 如:原数据是 45.78,接收过来就变成了 45.7799999999。
最后改成float接收,问题解决
【雷二】:
在C# 读取sqlserver中float数据时,C# 也使用 float 接收,结果读取出来的数据就不对了,后来上网查寻后,发现 sqlserver的float类型,对应C#的是double类型。
然后C# 换成double类型,暂时解决了这个问题,为啥叫暂时解决了?因为后面有 踩到了一个很容易忽略的雷。
【雷三】:
在第二步的基础上,使用double类型,接收了float数据后,需要进行四舍五入的计算,结果郁闷了。double的四舍五入是西方的概念,不是中国的四舍五入概念。怎么理解呢?也就是说 double的 四舍五入,实际逻辑是 “四舍六入,五平均”,四舍六入好理解,何为“五平均”呢?举个例子你就明白了
原数double类型:45.465 Math.Round(45.465,2) 结果就是 45.47
45.475 Math.Round(45.475,2) 结果仍是 45.47
这就叫 “五平均”,看前面的那个数是偶数还是奇数,然后偶数进一,奇数不进一。
【注意】还有一个注意点: Math.Round(45.475,2,MidpointRounding.AwayFromZero); MidpointRounding.AwayFromZero对正数有用,对负数无效。
最后使用Decimal解决了这个问题, 但Decimal不存在这个问题,于是使用了Decimal类型接收了数据库的float类型,解决了第二个雷遗留的问题。