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

标签 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);

此操作可能会损失精度吗?

谢谢,何塞·路易斯。

最佳答案

它总是打印 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/

相关文章:

java - 检查我是否理解基本的 Java 位运算

c - 引用 block 作用域外但函数作用域内的变量 (C/C++)

C 测试问题中的循环缓冲区实现

c - 无论输入如何,Min 函数都会给出输出 6422164

oracle - 棘手的Oracle解析函数问题

math - 算术溢出时硬件中断?

c - C语言工资单生成程序

sql - 在 Oracle 中将数据从一个数据库复制到另一个数据库

sql - Oracle 正则表达式替换多次出现的用逗号包围的字符串

javascript - 计算 d3 路径中的弧/点