打印浮动的确切值

时间:2016-05-26 23:05:40

标签: c++ floating-point

程序(MySQL是一个例子)如何存储像0.9这样的浮点数然后以0.9的形式返回给我?为什么它不会返回0.899 ......?

我目前遇到的问题是使用C ++从MySQL中检索浮点值,然后重新打印这些值。

3 个答案:

答案 0 :(得分:1)

简而言之,发生的事情是,将浮点近似值0.9转换为十进制文本的函数实际上会得到0.90000....01230.89999....9573之类的值。这将四舍五入为0.90000...0。然后修剪掉这些尾随零,这样你就可以得到一个整洁的0.9

虽然浮点数不精确,并且通常不在内部使用基数10,但实际上它们可以精确地保存和恢复十进制表示。例如,IEEE 754 64位表示具有足够的精度来保存15个十进制数字。这通常映射到C语言类型double,并且该语言具有常量DBL_DIG,当此类型为double时,该常量为15。

如果将15位或更少的十进制数转换为double,则可以将其转换回该数字。转换例程只需将其四舍五入为15位;当然,如果转换例程使用40位数字,则会有乱码的尾随数字,表示浮点值和原始数字之间的误差。打印的数字越多,呈现的错误就越准确。

还有一个相反的问题:给定一个浮点对象,是否可以将其打印成十进制数,以便可以扫描生成的十进制数以重现该对象?对于IEEE 64位双精度,其所需的小数位数为17。

答案 1 :(得分:1)

有一些软件库,如Gnu MP,可以实现任意精度算术,可以计算浮点数到指定的精度。例如,使用Gnu MP,你可以增加0.3到0.6,然后得到0.9。不多也不少。

数据库服务器几乎完全相同。

对于正常的磨机应用程序运行,本机浮点运算速度很快,而且足够好。但是数据库服务器通常有足够的CPU备用周期。它们的限制因素不会是CPU,而是可用的I / O带宽。在执行复杂的任意精度算术计算时,它们将有大量的CPU周期。

答案 2 :(得分:1)

有许多算法可以循环浮点数,在读回时会产生相同的内部表示。有关主题的概述,以及包含算法完整详细信息的论文的链接,请参阅< / p>

Printing Floating-Point Numbers