• 11087阅读
  • 6回复

[提问]求教控件double_Spinbox的取值精度问题 [复制链接]

上一主题 下一主题
离线ding1999
 

只看楼主 倒序阅读 楼主  发表于: 2014-06-25
直接用Spinbox的value()方法取值,如界面上填写的是2177.20,value()返回的却是2177.19999999(赋给一个double),
先取QString再使用toDouble转换也是一样的i结果,求教怎么解决?
离线dbzhang800

只看该作者 1楼 发表于: 2014-06-25
这个,误差不可能这么大(或者发帖时你那个数字后面少写了几个9?)。


言归正传,这个问题没办法解决,因为在C/C++里面,根本就没有和十进制浮点数 2177.20 对应的double。

哪怕

double a =  2177.20;

这么简单的语句,a中都不是你想要的 2177.20 这个数。
离线ding1999

只看该作者 2楼 发表于: 2014-06-26
谢谢回复。可能是少写了几个9,具体几个我没记。
但是2177.00有对应的double2177.0000000000.。。。
我只想要2177.20000000000.。。不行吗?


离线dbzhang800

只看该作者 3楼 发表于: 2014-06-26
回 ding1999 的帖子
ding1999:谢谢回复。可能是少写了几个9,具体几个我没记。
但是2177.00有对应的double2177.0000000000.。。。
我只想要2177.20000000000.。。不行吗?
 (2014-06-26 09:02) 

至少现在不行,但不排除以后会有10进制的计算机,而且移植了C/C++ 。

在二进制的世界中,你没有办法用有限位数字表示 这种数据,就如同,在10进制世界中,你没有办法用有限小数表示1/3一样。

话说回来,这点精度损失对你有什么影响么,你在做财务软件,还是超高精度的数值计算?
1条评分金钱+10
ding1999 金钱 +10 - 2014-06-26
离线ding1999

只看该作者 4楼 发表于: 2014-06-26
回 dbzhang800 的帖子
dbzhang800:至少现在不行,但不排除以后会有10进制的计算机,而且移植了C/C++ 。
在二进制的世界中,你没有办法用有限位数字表示 这种数据,就如同,在10进制世界中,你没有办法用有限小数表示1/3一样。
....... (2014-06-26 09:29) 

是在做金融软件。因为要从界面上读取一个价格(比如2177.20),然后判断这个价格是不是一个最小变动价的倍数(比如0.20);如果读到的是2177.199999....,那就怎么都整除不了了。
判断是否整除的策略是用dPrice 与 (int)(dPrice / d) * d比较,不知是否有更好的解决办法?
离线dbzhang800

只看该作者 5楼 发表于: 2014-06-26
金融软件运算时 不能用float/double这种二进制浮点数(你是做这个的,应该比我清楚),需要使用十进制浮点数,比如,GCC有 decimal的扩展,Qt也有其他人写的 decimal 的类。或者直接使用整数进行运算。

不过,对你从界面读值来说,这应该不是什么问题。你需要的无非是将其转换成decimal类型或者整数类型,而后进行运算。转换的过程中,精度是完全可控的。

比如 2177.1999999... 这样的数,你转换成 deciaml("2177.20") 或者整数 217720 都很容易办到。
离线ding1999

只看该作者 6楼 发表于: 2014-06-26
回 dbzhang800 的帖子
dbzhang800:金融软件运算时 不能用float/double这种二进制浮点数(你是做这个的,应该比我清楚),需要使用十进制浮点数,比如,GCC有 decimal的扩展,Qt也有其他人写的 decimal 的类。或者直接使用整数进行运算。
不过,对你从界面读值来说,这应该不是什么问题。你需要的无非是将其转换成dec .. (2014-06-26 12:54) 

对,先读取字符串然后把小数点去掉,转换成int后再计算。多谢!
快速回复
限100 字节
 
上一个 下一个