代码如下:
System.out.println(10 / 3.0);
这行代码输出的是3.3333333333333335
我知道有两个知识点:
1.整数和小数进行运算的时候,整数的类型自动提升为double类型,两个double类型进行相除运算,结果得到小数(也就是3.3333333333333335),即10先自动提升为double类型,再和3.0进行除法运算
2./获取的是除法操作的商,%获取的是除法操作的余数
而我的问题是:这行代码怎么算到是3.3333333333333335?
不知道这么想对不对:按照我们平时的计算法则,10除以3的商是3,余数是1,但是10变成double和同样是double类型的3.0进行除法运算就涉及到二进制除法了,先把double这个8字节的数据类型展开成32个二进制位,然后进行二进制的除法计算得到补码,然后补码倒推出源码,把商提取出来
再扯下去我就晕了
我不是计算机相关专业的,有没有大佬能详细的解答下
System.out.println(10 / 3.0);
这行代码输出的是3.3333333333333335
我知道有两个知识点:
1.整数和小数进行运算的时候,整数的类型自动提升为double类型,两个double类型进行相除运算,结果得到小数(也就是3.3333333333333335),即10先自动提升为double类型,再和3.0进行除法运算
2./获取的是除法操作的商,%获取的是除法操作的余数
而我的问题是:这行代码怎么算到是3.3333333333333335?
不知道这么想对不对:按照我们平时的计算法则,10除以3的商是3,余数是1,但是10变成double和同样是double类型的3.0进行除法运算就涉及到二进制除法了,先把double这个8字节的数据类型展开成32个二进制位,然后进行二进制的除法计算得到补码,然后补码倒推出源码,把商提取出来
再扯下去我就晕了
我不是计算机相关专业的,有没有大佬能详细的解答下
因为刚跟着视频学,现在是javase部分,所以可能对java语言认知还不太全面
public class TestA { public static void main(String[] args) {
// TODO Auto-generated method stub
BigDecimal a1 = new BigDecimal(Double.toString(10));
BigDecimal a2 = new BigDecimal(Double.toString(3));
System.out.println(a1.divide(a2, 20, BigDecimal.ROUND_HALF_UP));
}}
输出结果:3.33333333333333333333
目前设置的精度是小数点后20位,采用的是四舍五入
诸位大佬你们讲得太深了,我昨天才刚刚学到if语句和swich语句,第一个大佬提到的那个IEEE754我是在学 long和float的时候视频里的老师才有提到的,但是也是很简简单单的讲了下,并没有深入的讲解IEEE754
不知道是不是我看的是培训机构的视频的原因,我觉得有几个知识点可以深挖的,但视频里的老师都没讲的太细,我也不知道这么深挖有没有必要。我先放一放,学完javase再回来看看
顺便问下,由于我是第一次来csdn,貌似这里和其他论坛不太一样,我引用你的回复,你看得到吗,我都不知道我回复的你们有没有看的到,貌似这样不利于交流
还有,好像我是要点 结贴 那个按键的吧,不知道怎么给分你们csdn这种发帖搞得我晕乎乎的
参考https://www.cnblogs.com/pcheng/p/5588652.htm
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数
或者1.0000....001 这种,所以除出来的数据精度存在偏差,对double类型的进行运算需要先转换称bigdecimal型的