我想从double获取小数部分,这是我的代码来获取小数部分
double decimalvalue = 23423.1234-23423.0;
0.12340000000040163
但减法后我期待十进制值为0.1234,但我得到0.12340000000040163。请帮助我理解这种行为,以及是否有任何解决方法。
答案 0 :(得分:8)
我建议你看看
What Every Computer Scientist Should Know About Floating-Point Arithmetic
您可以在浮点数中指定有限数量的值,但在所表示的范围内有无限数量的浮点数。
因此,无法在任何浮动/双重样式数据类型中准确表示某些浮点数。
处理特定问题的典型方法是避免直接相等比较,而是进行epsilon测试:查看预期值和计算值是否在一些较小的数字内(与减去的值相比),称为 epsilon 彼此。
间接相关的是Machine Epsilon的概念,值得看一看完整的理解
答案 1 :(得分:3)
这是一个舍入错误。在十进制中,你不能完美地代表给定数字位数的1/3(比如说15)。在基数2中,还有很多你无法表达的东西,0.1234恰好是其中之一。精度取决于比例,但对于双精度,它大约是15个十进制数字。我建议您查看http://en.wikipedia.org/wiki/IEEE_floating_point以获取有关浮点数的更多详细信息。
如果您正在尝试制作基础10系统(例如人类使用的计算器)并且您需要精确的结果,则应使用BCD。