鉴于此代码:
#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);
此操作可能会损失精度吗?
谢谢,何塞·路易斯。
最佳答案
它总是打印 10000 个不同的数字吗? --> 是的 - 使用此代码。
(float)i/100000)
它总是打印 100000 个不同的数字吗? --> 也许吧。
这将一直有效,直到代码达到约 6 位以上有效十进制数字的 float
精度。它取决于 FLT_DIG
,它是 6
或更大。
“精确到小数点后四位。”比较棘手。 float
是一个 float 。有了它,您就有 6 位以上的有效数字,例如 1234560000.0,而不是小数点后 4 位数字 - 这可能需要“定点”。
如果代码需要所有结果都正确为 19 位数字,则需要采用不同的方法。即使是 double
也可能无法满足编码目标,因为它至少有 10 位(通常是 15-17 位)有效数字。
使用 Oracle NUMBER(19,4)
必须使用 65 位以上的数字。 (至少 64 位精度,1 位符号)。没有任何标准 C 整数/浮点类型能够始终满足这一要求。除非代码使用某种结构,否则我认为没有任何解决方案可以始终防止精度损失。
关于将整数转换为 float 而不丢失精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32463058/