鉴于此代码:
#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。
答案 0 :(得分:2)
它会打印10000个不同的数字吗? - &GT;是的 - 使用此代码。
(float)i/100000)
它会打印出100000个不同的数字吗? - &GT;也许。
这将一直有效,直到代码达到约{6}有效十进制数的float
精度。这取决于FLT_DIG
,6
或更大。
“四位小数的准确度。”比较棘手。 float
是浮动点数。有了它你有6位有效数字,如1234560000.0,小数点后不是4位数 - 可能需要“固定点”。
如果代码需要所有结果都正确到19位,则需要采用不同的方法。即使double
可能也不符合编码目标,因为它至少有10个,通常是15-17个数字。
使用Oracle NUMBER(19,4)
必须使用65位以上的数字。 (至少64位精度,1位符号)。没有标准的C整数/浮点类型可以满足这一要求。除非代码使用某种结构,否则我看不到任何能够始终防止精度损失的解决方案。
答案 1 :(得分:0)
另一种方法是使用(隐式)定点。只需通过删除小数点,将数字表示为整数。当您需要计算中的值时,请通过乘以0.0001来恢复它们。
32位整数将允许范围-214748.3648
到214748.3647
,可能太有限了。
64位整数将允许范围-922337203685477.5808
到922337203685477.5807
。
请注意,这比双精度浮点数中存储的精度更准确,因此您应该考虑所需的实际范围以及要支持的算术运算。