关于强制转换
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。
搞不懂为什么? 在浮点数的世界里,有没有最后那个9,也许是8
都没啥意义,主要看精度,看你需要小数点后面几位 wp231957 发表于 2021-5-22 09:19
在浮点数的世界里,有没有最后那个9,也许是8
都没啥意义,主要看精度,看你需要小数点后面几位
懂了 因为十进制的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]