世林 发表于 2021-5-21 22:21:39

关于强制转换

import java.util.Scanner;

public class 取小数 {
    public static void main(String[] args) {
      Scanner input=new Scanner(System.in);
      double a=input.nextDouble();
      double b=a-(int)a;
      System.out.print((float) b);
    }
}

关于最后一行的 System.out.print((float) b);中的(float)为什么会影响最后的输出结果?
例如输入3.1时,有(float)时候输出的是0.1;
                        没有时输出的结果是0.10000000000000009。
搞不懂为什么?

wp231957 发表于 2021-5-22 09:19:53

在浮点数的世界里,有没有最后那个9,也许是8
都没啥意义,主要看精度,看你需要小数点后面几位

世林 发表于 2021-5-23 15:11:51

wp231957 发表于 2021-5-22 09:19
在浮点数的世界里,有没有最后那个9,也许是8
都没啥意义,主要看精度,看你需要小数点后面几位

懂了

muyuanjin 发表于 2021-5-30 00:54:58

因为十进制的0.1不能被二进制准确描述,就像十进制的10/3=0.333333333...,但是三进制表示该算式就是101/10=10.1
0.1+0.2=0.30000000000000004是一个著名的梗,以下详细解释来自0.30000000000000004.com

其实还是蛮有趣的。当您有一个以 10 为底的系统(如我们的系统)时,它只能表达使用基数的质因数的分数。10 的质因数是 2 和 5。所以 1/2、1/4、1/5、1/8 和 1/10 都可以清楚地表达出来,因为分母都使用 10 的质因数。相反,1 /3、1/6、1/7 和 1/9 都是重复小数,因为它们的分母使用质因数 3 或 7。

在二进制(或基数 2)中,唯一的质因数是 2,因此您只能清楚地表达分母只有 2 作为质因数的分数。在二进制中,1/2、1/4、1/8 都可以清楚地表示为小数,而 1/5 或 1/10 将重复小数。因此,0.1 和 0.2(1/10 和 1/5)虽然在以 10 为基数的系统中是干净的小数,但在计算机使用的以 2 为基数的系统中是重复小数。当您对这些重复的小数进行数学运算时,您最终会得到剩余部分,当您将计算机的 base-2(二进制)数转换为更易于人类阅读的 base-10 表示时,这些剩余部分会保留下来。
页: [1]
查看完整版本: 关于强制转换