小数到二进制精度

问题描述 投票:0回答:1

请考虑以下分数:

9.8765

如何将其转换为精确的浮点二进制数而不丢失任何值?

现在考虑以下分数

9.87654321

同样,我如何将其转换为浮点二进制而不丢失其值。

我想确定从浮点二进制值重建分数时需要多少个精确二进制位。

这只是一个例子,我希望对具有很多数字的大数部分(例如9.876543210192283647582910)执行操作。

如果示例使用Java,请注意。

谢谢!

floating-point binary fractions
1个回答
0
投票

[通常,只有在分母的所有素数均为R的情况下,有理数才能表示为R的基数。

将其应用于十进制数时,且仅当最低数2和5是分母的唯一素数时,有理数才具有终止的十进制扩展数。因此13/40具有终止的十进制扩展名,而1/3则没有。

对于二进制分数,这意味着对于整数A和B将有理数表示为A / 2 B

。由于2是10的因数,所以所有二进制分数都可以表示为十进制分数。 5不是2的因数,因此某些小数部分(例如1/10)不能表示为二进制分数。

[将条件精确表示为普通Java double还有其他条件。 B必须在[-1022,1023]范围内,并且A必须具有不超过53个有效位。还有其他次正规数,指数为-1023。增加位数会放宽这些限制,但仍不允许以二进制浮点数精确表示1/10之类的数字。

两个最常见的解决方案是使用它,或切换到BigDecimal

9.87650000000000005685681881886080801486968994140625非常非常接近9.8765。对于长度和重量等物理量,即使使用良好的实验室设备,测量误差也将超过转换误差。当然,由于在随后的计算中舍入,某些算法会累积明显的误差。

BigDecimal对于以十进制扩展名结尾的数字特别有用。财务计算通常必须处理0.01或0.001的精确倍数。尽管它允许任意精度,直到可用内存,但它不能避免所有舍入错误。没有BigDecimal正好等于1/3。

© www.soinside.com 2019 - 2024. All rights reserved.