java - 工作小数点数

标签 java floating-point-precision

我用 java 编写了一个关于 float 的程序,但获得的输出不准确;而用 C 编写的相同程序确实产生了准确的结果。

代码片段:

public class One {

public static void main(String...args){

    double i, num=0.0;
    for(i=0;i<10;i++)
    num=num+0.1;
    System.out.println(num);

    }
}

输出:0.9999999999999999

C中的程序是这样的

#include<stdio.h>
main()
{

double i,num=0.0;
for(i=0;i<10;i++)
num=num+0.1;

printf("%f",num);

}

输出:1.00000

我做错了什么?

最佳答案

C 隐藏了问题而不是移除它

认为 C 程序更准确的想法是对正在发生的事情的误解。两者的答案都不精确,但默认情况下 C 已四舍五入为 6 位有效数字。 隐藏微小错误。如果您在计算中实际使用该值(例如 num==1),您会发现两者都不准确。

通常对于编写好的程序并不重要

一般来说,智能编写的程序可以毫无困难地处理这个微小的错误。例如,您的程序可以重写为每次都重新创建一个 double

double i, num=0.0;
for(i=0;i<10;i++)
   num=0.1*i;
   System.out.println(num);

}

意思是错误不会增长。此外,你不应该将 == 与 double 一起使用,因为在那里可以看到微小的不准确。

在非常非常偶然的情况下,这个微小的错误是一个问题(货币程序是最常见的);可以使用 bigDecimal。

这不是 float 的问题,而是从 10 进制到 2 进制的转换。

有以10为底的分数不能准确表示;例如 1/3。同样,有些分数无法用二进制精确表示,例如 1/10。 It is from this perspective that you should look at this

本例中的问题是,当您写入“0.1”时,计算机必须将其转换为二进制数,即 10 进制数,0.1=(binary)0.00011001100110011001100110011001...... 永远,但因为它不能用空格精确地表示它以二进制形式结束,所以它最终为 (binary)0.0001100110011001。一个二进制友好数字(例如 1/2)将是完全准确的,直到 double 字用完(此时甚至无法准确表示二进制友好数字)

1小数位数不准确

关于java - 工作小数点数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20494126/

相关文章:

java - 在java swing中调整窗口大小时如何使按钮粘在一个地方?

php - 我遇到有关使用数组 php 进行数学运算的问题

python - 降低 python 中的浮点精度以提高性能

java - 将 B 树节点持久保存到 RandomAccessFile

java - WildFly - 与尝试解决安全漏洞相关的应用程序部署问题

java - 一个java程序 "type"可以变成另一个windows程序如记事本吗

java - 在请求体上获取整数

floating-point - 添加 32 位 float 。

c++ - 使用整数运算的浮点加法

c++ - N 个区间的 bool 规则 (C)