将整数转换为float而不会丢失精度

时间:2015-09-08 16:42:49

标签: c oracle math floating-point int

鉴于此代码:

#include <stdio.h>

int main()
{
    for (int i=1; i <= 10000; ++i)
    {
        printf("i= %.4lf\n", (float)i/10000);
    }
}

它会打印10000个不同的数字吗?

i= 0.0002
i= 0.0003
i= 0.0004
i= 0.0005
. . .
i= 0.9995
i= 0.9996
i= 0.9997
i= 0.0001
i= 0.9998
i= 0.9999
i= 1.0000

我想在Oracle数据库中插入货币值,需要一个 四位小数的准确度。我听说过NUMBER(19,4)数据类型在Oracle中保证了这种准确性,但需要确保它是在我的C程序中获得的。

我的插入声明将与此类似:

INSERT INTO PRUEBA VALUES(i/10000);

这种操作可以降低精度吗?

谢谢Jose Luis。

2 个答案:

答案 0 :(得分:2)

它会打印10000个不同的数字吗? - &GT;是的 - 使用此代码。

(float)i/100000)它会打印出100000个不同的数字吗? - &GT;也许。

这将一直有效,直到代码达到约{6}有效十进制数的float精度。这取决于FLT_DIG6或更大。

“四位小数的准确度。”比较棘手。 float浮动点数。有了它你有6位有效数字,如1234560000.0,小数点后不是4位数 - 可能需要“固定点”。

如果代码需要所有结果都正确到19位,则需要采用不同的方法。即使double可能也不符合编码目标,因为它至少有10个,通常是15-17个数字。

使用Oracle NUMBER(19,4)必须使用65位以上的数字。 (至少64位精度,1位符号)。没有标准的C整数/浮点类型可以满足这一要求。除非代码使用某种结构,否则我看不到任何能够始终防止精度损失的解决方案。

答案 1 :(得分:0)

另一种方法是使用(隐式)定点。只需通过删除小数点,将数字表示为整数。当您需要计算中的值时,请通过乘以0.0001来恢复它们。

32位整数将允许范围-214748.3648214748.3647,可能太有限了。

64位整数将允许范围-922337203685477.5808922337203685477.5807

请注意,这比双精度浮点数中存储的精度更准确,因此您应该考虑所需的实际范围以及要支持的算术运算。