Skip to content

Latest commit

 

History

History
54 lines (45 loc) · 2.05 KB

File metadata and controls

54 lines (45 loc) · 2.05 KB

面试题:Java中long和double类型的最大取值

面试题: Java中, long 和 double 都是8字节64位存储的, 请问哪个类型能表示的自然数范围更大?

示例代码为:

package com.cncounter.test.util;

import java.math.BigDecimal;

/*
面试题: Java中, long 和 double 都是8字节64位存储的, 请问哪个类型能表示的自然数范围更大?
 */
public class LongDoubleTest {
    public static void main(String[] args) {
        // 大约 922亿亿;
        long longMax = Long.MAX_VALUE;
        double doubleMax = Double.MAX_VALUE;
        // longMax = 9223372036854775807
        System.out.println("longMax = " + longMax);
        // 1E8 = 1亿, 1后面带8个0;
        // 1E8 = 100000000
        System.out.println("1E8 = " + Double.valueOf(1E8).longValue());
        // 1.79E308大约是: 1.79万亿亿亿亿亿...(重复 308/8 ~= 38 个左右的单位 "亿")
        // doubleMax = 1.7976931348623157E308
        System.out.println("doubleMax = " + doubleMax);

        // d1 = 9.223372036854776E18
        double d1 = longMax;
        System.out.println("d1 = " + d1);
        // d2 = 9.223372036854776E18
        double d2 = d1 - 10.0;
        System.out.println("d2 = " + d2);
        // 可以发现, 双精度已经丢精度了; d1 和 d2 区分不开;
        // (d1 == d2) : true
        System.out.println("(d1 == d2) : " + (d1 == d2));
        // 大数值需要使用 BigDecimal
        BigDecimal decimal = new BigDecimal(longMax);
        // bigValue = 85070591730234615847396907784232501249
        BigDecimal bigValue = decimal.multiply(decimal);
        System.out.println("bigValue = " + bigValue);
        // BigDecimal 除法计算必须指定 scale 精度, 四舍五入方法(区别在于边界值0.5的时候怎么取值)
        int scale = 18;
        BigDecimal divideValue = bigValue.divide(new BigDecimal(Math.PI),
                scale, BigDecimal.ROUND_HALF_UP);
        // divideValue = 27078810371238705561432334334038776498.543974388218463903
        System.out.println("divideValue = " + divideValue);
    }
}