【发布时间】:2015-09-08 16:42:49
【问题描述】:
鉴于此代码:
#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);
此操作可能会丢失精度吗?
谢谢,何塞·路易斯。
【问题讨论】:
-
不要将浮点数用于货币或其他精确值。
-
@Oalf 浮点小数是一种非常可接受的表示货币的选择。
-
我在某处发现了这个,也许它可以帮助你:What Every Computer Scientist Should Know About Floating-Point Arithmetic。我忘记是哪个帖子了...
-
@chux,只有在您不介意 float 不能准确表示所有值的情况下才可以接受,因此结果将是计算结果中的错误。
-
@chux - C
float值与您所说的这些“十进制浮点”值有什么关系?引用一个非常容易找到的谷歌热门:(spin.atomicobject.com/2014/08/14/currency-rounding-errors)“在使用货币进行任何类型的计算时,准确性非常重要。浮点数(浮点数和双精度数)没有准确的足够的表示以防止在使用货币值进行算术时累积舍入误差。"
标签: c oracle math floating-point int