程序(MySQL是一个例子)如何存储像0.9这样的浮点数然后以0.9的形式返回给我?为什么它不会返回0.899 ......?
我目前遇到的问题是使用C ++从MySQL中检索浮点值,然后重新打印这些值。
答案 0 :(得分:1)
简而言之,发生的事情是,将浮点近似值0.9转换为十进制文本的函数实际上会得到0.90000....0123
或0.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>