Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。
运行结果:
加法用value结果:1000000.005000000000000000104083408558608425664715468883514404296875 加法用string结果:1000000.005 减法value结果:-999999.994999999999999999895916591441391574335284531116485595703125 减法用string结果:-999999.995 乘法用value结果:5000.000000000000104083408558608425664715468883514404296875000000 乘法用string结果:5000.000 绝对值用value结果:1000000 绝对值用string结果:1000000 除法用value结果:199999999.99999999583666365766 除法用string结果:200000000.00000000000000000000
因此建议使用String初始化。
1)System.out.println()中的数字默认是double类型的,double类型小数计算不精准。
2)使用BigDecimal类构造方法传入double类型时,计算的结果也是不精确的!
因为不是所有的浮点数都能够被精确的表示成一个double 类型值,有些浮点数值不能够被精确的表示成 double 类型值,因此它会被表示成与它最接近的 double 类型的值。必须改用传入String的构造方法。这一点在BigDecimal类的构造方法注释中有说明。
LeetCode:
Given two numbers represented as strings, return multiplication of the numbers as a string.
Note: The numbers can be arbitrarily large and are non-negative.
给定两个表示为字符串的数字,返回这两个数字的乘法运算结果。
注意:数字可以任意大且非负。
其中一种java语言解法利用到了BigDecimal.代码如下:
import java.math.BigDecimal; public class Solution { public String multiply(String num1, String num2) { return new BigDecimal(num1).multiply(new BigDecimal(num2)).toString(); } }