鱼C论坛

 找回密码
 立即注册
查看: 6443|回复: 3

[已解决]关于强制转换

[复制链接]
发表于 2021-5-21 22:21:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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。
搞不懂为什么?
最佳答案
2021-5-22 09:19:53
在浮点数的世界里,有没有最后那个9,也许是8
都没啥意义,主要看精度,看你需要小数点后面几位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-22 09:19:53 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
在浮点数的世界里,有没有最后那个9,也许是8
都没啥意义,主要看精度,看你需要小数点后面几位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 表示时,这些剩余部分会保留下来。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 19:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表