问题描述
如题,(decimal)100/(decimal)300*(decimal)60的运算结果是多少?20?是19.999999999999999999999999998有点费解。(double)100/(double)300*(double)60的运算结果是20有点无法理解,求解!感谢!
解决方案
解决方案二:
精度不一样。
解决方案三:
正常,浮点数的精度损失造成的。
解决方案四:
楼上都正解
解决方案五:
回答要么浅尝辄止,要么似是而非,都毫无用处
解决方案六:
double是64位的,比single-32位精度高decimal128位高精度浮点数,常用于金融运算,不会出现浮点数计算的误差,decimal类型具有更高的精度和更小的范围,这使它适合于财务和货币计算。通常都是这么介绍的。
解决方案七:
double是64位浮点保留的精度少decimal是128位浮点,他精度保留的多所以他的结果跟接近正确然后表达式运算,只能说表达式解析规则解析的表达式树决定他先运算100/300,所以两边保留的精度问题导致运算的精度问题
解决方案八:
引用
不会出现浮点数计算的误差
首先这句话是错滴,不是不会出现浮点运算误差,而是他有误差,他也是浮点数,但是128位的精度比较高,对于普通金融运算这个精度可以认为比较高
解决方案九:
decimal是定长小数类型(decimal)100/(decimal)300*(decimal)60得19.999999999999999999999999998是因为你没有指定小数位数,且使用了低精度算式(100/300是无限循环小数)(decimal)100/(decimal)300实际是0.3333333333333333333333333333(28位小数)后面的就截断了(decimal)100*(decimal)60/(decimal)300就得到20了不会出现浮点数计算的误差,是说他会按金融运算的规则对超宽的小数部分做舍入(不是简单的四舍五入)你示例的算式,正好演示了数值运算时误差的产生
解决方案十:
引用6楼wanghui0380的回复:
double是64位浮点保留的精度少decimal是128位浮点,他精度保留的多所以他的结果跟接近正确然后表达式运算,只能说表达式解析规则解析的表达式树决定他先运算100/300,所以两边保留的精度问题导致运算的精度问题
我奇怪的是,这时候double反而正常了,难道是巧合?我之前说的话也只是引用了一下,对于各种信息,我觉得有点迷惑。
解决方案十一:
引用8楼xuzuning的回复:
decimal是定长小数类型(decimal)100/(decimal)300*(decimal)60得19.999999999999999999999999998是因为你没有指定小数位数,且使用了低精度算式(100/300是无限循环小数)(decimal)100/(decimal)300实际是0.3333333333333333333333333333(28位小数)后面的就截断了(decimal)100*(decimal)60/(decimal)300就得到20了不会出现浮点数计算的误差,是说他会按金融运算的规则对超宽的小数部分做舍入(不是简单的四舍五入)你示例的算式,正好演示了数值运算时误差的产生
我知道(decimal)100*(decimal)60/(decimal)300就得到20了,按照一直一来学习的印象感觉应该先约分,再计算,对吧?基于这个认识,我想了解一下,我举例的算法decimal得到的结果,反而是19.999999……?这是问题部分一,难道我一直以来的算术原则有问题?问题部分二,而这时候double的计算却是20,这是凑巧吗?还是说两种数据类型对表达式的理解不一样?以上两部分问题,是我觉得不了解的。在此也特别感谢一下认真作答的wanghui0380和xuzuning!