BigDecimal 小数 浮点数 精度 财务计算
简介
- 单精度浮点型变量float可以处理6~7位有效数,双精度浮点型变量double可以处理15~16位有效数,在实际应用中,如果需要对更大或者更小的数进行运算和处理,这时候float和double就如能为力了。
- 借用《Effactive Java》这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算,他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场啦。
public class BigDecimal extends Number implements Comparable<BigDecimal>
BigDecimal bd = BigDecimal.valueOf(0.4);
BigDecimal bd2 = BigDecimal.valueOf(0.6);
bd.add(bd2);//虽然做了加法操作,但是bd并没有保存加操作后的值
bd2 = bd.add(bd2);//bd2指向了一个新的BigDecimal对象的引用
System.out.println(bd.doubleValue() + " " + bd2.doubleValue());//0.4 1.0
System.out.println(BigDecimal.valueOf(0.4).add(BigDecimal.valueOf(0.6)));//1.0。计算时一般都会链式调用
MathContext 类
public final class MathContext extends Object implements Serializable
- precision:某个操作使用的数字个数;结果舍入到此精度
- roundingMode:一个 RoundingMode 对象,该对象指定舍入使用的算法。
- MathContext(int setPrecision) 构造一个新的 MathContext,它具有指定的精度和 HALF_UP 舍入模式。 参数setPrecision为非负 int 精度设置。
- MathContext(int setPrecision, RoundingMode setRoundingMode) 构造一个新的 MathContext,它具有指定的精度和舍入模式。
- MathContext(String val) 根据字符串构造一个新的 MathContext。该字符串的格式必须与 toString() 方法生成的字符串的格式相同。
- static MathContext DECIMAL128:一个 MathContext 对象,其精度设置与 IEEE 754R Decimal128 格式(即 34 个数字)匹配,舍入模式为 HALF_EVEN,这是 IEEE 754R 的默认舍入模式。
- static MathContext DECIMAL32 : 一个 MathContext 对象,其精度设置与 IEEE 754R Decimal32 格式(即 7 个数字)匹配,舍入模式为 HALF_EVEN,这是 IEEE 754R 的默认舍入模式。
- static MathContext DECIMAL64 : 一个 MathContext 对象,其精度设置与 IEEE 754R Decimal64 格式(即 16 个数字)匹配,舍入模式为 HALF_EVEN,这是 IEEE 754R 的默认舍入模式。
- static MathContext UNLIMITED : 其设置具有无限精度算法所需值的 MathContext 对象。该设置的值为: precision=0,roundingMode=HALF_UP
- int getPrecision() 返回 precision 设置。此值始终为非负数。
- RoundingMode getRoundingMode() 返回 roundingMode 设置。它将是8种RoundingMode之一。
- boolean equals(Object x) 将此 MathContext 与指定的 Object 进行相等性比较。
- int hashCode() 返回此 MathContext 的哈希码。
- String toString() 返回此 MathContext 的字符串表示形式。
构造方法
通过BigInteger构造BD
- BigDecimal(BigInteger val) 将 BigInteger 转换为 BigDecimal。
- BigDecimal(BigInteger unscaledVal, int scale) 将 BigInteger 非标度值和 int 标度转换为 BigDecimal。
- BigDecimal(BigInteger val, MathContext mc)
- BigDecimal(BigInteger unscaledVal, int scale, MathContext mc)
通过char[]构造BD
- BigDecimal(char[] in) 将 BigDecimal 的字符数组表示形式转换为 BigDecimal,接受与 BigDecimal(String) 构造方法相同的字符序列。
- BigDecimal(char[] in, int offset, int len) 将 BigDecimal 的字符数组表示形式转换为 BigDecimal,接受与 BigDecimal(String) 构造方法相同的字符序列,同时允许指定子数组。
- BigDecimal(char[] in, MathContext mc)
- BigDecimal(char[] in, int offset, int len, MathContext mc)
通过基本数据类型构造BD
- BigDecimal(double val) 将 double 转换为 BigDecimal,后者是 double 的二进制浮点值准确的十进制表示形式。
- BigDecimal(int val) 将 int 转换为 BigDecimal。
- BigDecimal(long val) 将 long 转换为 BigDecimal。
- BigDecimal(String val) 将 BigDecimal 的字符串表示形式转换为 BigDecimal。
public BigDecimal(String val) {
this(val.toCharArray(), 0, val.length());
}
- BigDecimal(double val, MathContext mc)
- BigDecimal(int val, MathContext mc)
- BigDecimal(long val, MathContext mc)
- BigDecimal(String val, MathContext mc)
构造方法使用推荐
String string=new BigDecimal(0.1).toEngineeringString();
System.out.println(string + " " + string.length());//0.1000000000000000055511151231257827021181583404541015625 57
System.out.println(new BigDecimal(0.1).doubleValue() == 0.1);//true
System.out.println(new BigDecimal(1.22) + " " + new BigDecimal("1.22"));//1.2199999999999999733546474089962430298328399658203125 1.22
System.out.println(new BigDecimal(1.22).doubleValue() == new BigDecimal("1.22").doubleValue());//true,并且都 == 1.22
- 先使用 Double.toString 方法将 double 转换为 String,然后使用含有 String 的构造方法。
含有 String 的构造方法是完全可预知的:写入 new BigDecimal("0.1") 将创建一个 BigDecimal,它正好等于预期的 0.1。因此,比较而言,通常建议优先使用含有 String 的构造方法。
System.out.println(new BigDecimal("0.1") + " " + new BigDecimal("0.1").toEngineeringString());//0.1 0.1
- 也直接使用BigDecimal类中静态的valueOf方法,这通常是将 double 和 float 转换为一个 BigDecimal 的最好方式(第一种方式从本质上将也是采用的这种方式)
public static BigDecimal valueOf(double val) {
return new BigDecimal(Double.toString(val));//第一种方式从本质上将也是采用的这种方式
}
静态字段
三个实例
- static BigDecimal ONE 值为 1,标度为 0。
- static BigDecimal TEN 值为 10,标度为 0。
- static BigDecimal ZERO 值为 0,标度为 0。
以下模式和RoundingMode中定义的模式是完全一致的,且JDK中建议使用RoundingMode中定义的模式。具体详见另一篇笔记。
- static int ROUND_CEILING(天花板; 最高限度) 接近正无穷大的舍入模式。
- static int ROUND_DOWN 接近零的舍入模式。
- static int ROUND_FLOOR 接近负无穷大的舍入模式。
- static int ROUND_UP 舍入远离零的舍入模式。
- static int ROUND_UNNECESSARY 断言请求的操作具有精确的结果,因此不需要舍入。
- static int ROUND_HALF_DOWN 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
- static int ROUND_HALF_EVEN 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
- static int ROUND_HALF_UP 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
- static BigDecimal ONE 值为 1,标度为 0。
- static BigDecimal TEN 值为 10,标度为 0。
- static BigDecimal ZERO 值为 0,标度为 0。
- static int ROUND_CEILING(天花板; 最高限度) 接近正无穷大的舍入模式。
- static int ROUND_DOWN 接近零的舍入模式。
- static int ROUND_FLOOR 接近负无穷大的舍入模式。
- static int ROUND_UP 舍入远离零的舍入模式。
- static int ROUND_UNNECESSARY 断言请求的操作具有精确的结果,因此不需要舍入。
- static int ROUND_HALF_DOWN 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
- static int ROUND_HALF_EVEN 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
- static int ROUND_HALF_UP 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
公共方法
静态方法:将基本类型转换为BD
- static BigDecimal valueOf(double val) 返回值和 new BigDecimal(Double.toString(val)) 完全一致。
- static BigDecimal valueOf(long val) 将 long 值转换为具有零标度的 BigDecimal。
- static BigDecimal valueOf(long unscaledVal, int scale) 将 long 非标度值和 int 标度转换为 BigDecimal。
获取标度、精度、正负号
- int precision() 返回此 BigDecimal 的精度(精度是非标度值的数字【个数】)。零值的精度是 1。
- int scale() 返回此 BigDecimal 的标度。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负 scale 次幂。例如, -3 标度是指非标度值乘以 1000。
- int signum() 返回此 BigDecimal 的正负号函数。当此 BigDecimal 的值为负、零或正时,返回 -1、0 或 1。
System.out.println(BigDecimal.valueOf(54).precision() + " " + BigDecimal.valueOf(54).scale());//2 0 54=54*10^0
System.out.println(BigDecimal.valueOf(5).precision() + " " + BigDecimal.valueOf(5).scale());//1 0 5=5*10^0
System.out.println(BigDecimal.valueOf(5.4).precision() + " " + BigDecimal.valueOf(5.4).scale());//2 1 5.4=54*10^-1
System.out.println(BigDecimal.valueOf(0.054).precision() + " " + BigDecimal.valueOf(0.054).scale());//2 3 0.054=54*10^-3
- BigDecimal setScale(int newScale) 返回一个 BigDecimal,其标度为指定值,其值在数值上等于此 BigDecimal 的值。如果这不可能,则抛出 ArithmeticException。
- BigDecimal setScale(int newScale, int roundingMode) 返回一个 BigDecimal,其标度为指定值,其非标度值通过此 BigDecimal 的非标度值乘以或除以十的适当次幂来确定,以维护其总值。相对于此遗留方法,应优先使用新的 setScale(int, RoundingMode) 方法。
- BigDecimal setScale(int newScale, RoundingMode roundingMode) 返回 BigDecimal,其标度为指定值,其非标度值通过此 BigDecimal 的非标度值乘以或除以十的适当次幂来确定,以维护其总值。
BigDecimal bd = BigDecimal.valueOf(0.054);
System.out.println(bd.precision() + " " + bd.scale() + " " + bd.signum());//2 3 1 0.054=54*10^-3
BigDecimal bd2 = bd.setScale(4);
System.out.println(bd.precision() + " " + bd.scale() + " " + bd.signum());//2 3 1,还是那句话:BigDecimal是不可变的!
System.out.println(bd2.precision() + " " + bd2.scale() + " " + bd2.signum());//3 4 1 0.054=540*10^-4
加减乘除幂
- BigDecimal add(BigDecimal augend) 返回一个 BigDecimal,其值为 (this + augend),其标度为 max(this.scale(), augend.scale())。
- BigDecimal subtract(BigDecimal subtrahend) 返回一个 BigDecimal,其值为 (this - subtrahend),其标度为 max(this.scale(), subtrahend.scale())。
- BigDecimal multiply(BigDecimal multiplicand) 返回一个 BigDecimal,其值为 (this * multiplicand),其标度为 (this.scale() + multiplicand.scale())。
- BigDecimal divide(BigDecimal divisor) 返回一个 BigDecimal,其值为 (this / divisor),其首选标度为 (this.scale() - divisor.scale());如果无法表示准确的商值(因为它有无穷的十进制扩展),则抛出 ArithmeticException。
- BigDecimal pow(int n) 返回其值为 (this^n) 的 BigDecimal,准确计算该幂,使其具有无限精度。参数 n 必须在 0 到 999999999(包括)之间。ZERO.pow(0) 返回 ONE。 注意,未来版本可能会扩展此方法允许的指数范围。
- BigDecimal scaleByPowerOfTen(int n) 返回其数值等于 (this * 10^n) 的 BigDecimal。该结果的标度为 (this.scale() - n)。
- BigDecimal add(BigDecimal augend, MathContext mc)
- BigDecimal subtract(BigDecimal subtrahend, MathContext mc)
- BigDecimal multiply(BigDecimal multiplicand, MathContext mc)
- BigDecimal divide(BigDecimal divisor, MathContext mc) 返回其值为 (this / divisor) 的 BigDecimal(根据上下文设置进行舍入)。
- BigDecimal pow(int n, MathContext mc) 返回其值为 (thisn) 的 BigDecimal。
//测试加法 add
double addValue = BigDecimal.valueOf(0.05).add(BigDecimal.valueOf(0.01)).doubleValue();
System.out.println("0.05+0.01=" + (0.05 + 0.01) + " " + addValue);//0.05+0.01=0.060000000000000005 0.06
//测试减法 subtract
double subtractValue = BigDecimal.valueOf(1.0).subtract(BigDecimal.valueOf(0.42)).doubleValue();
System.out.println("1.0-0.42=" + (1.0 - 0.42) + " " + subtractValue);//1.0-0.42=0.5800000000000001 0.58
//测试乘法 multiply
double multiplyValue = BigDecimal.valueOf(4.015).multiply(BigDecimal.valueOf(100)).doubleValue();
System.out.println("4.015*100=" + (4.015 * 100) + " " + multiplyValue);//4.015*100=401.49999999999994 401.5
//测试除法 divide
double divideValue = BigDecimal.valueOf(123.3).divide(BigDecimal.valueOf(100), 10, BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println("123.3/100=" + (123.3 / 100) + " " + divideValue);//123.3/100=1.2329999999999999 1.233
//测试幂运算 pow、scaleByPowerOfTen
System.out.println(Math.pow(1.1, 2) + " " + BigDecimal.valueOf(1.1).pow(2).doubleValue());//1.2100000000000002 1.21
System.out.println(BigDecimal.ONE.scaleByPowerOfTen(1024));//1E+1024
- BigDecimal divide(BigDecimal divisor, int roundingMode) 返回一个 BigDecimal,其值为 (this / divisor),其标度为 this.scale()。如果必须执行舍入,以生成具有给定标度的结果,则应用指定的舍入模式。相对于此遗留方法,应优先使用新的 divide(BigDecimal, RoundingMode) 方法。
- BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode) 返回一个 BigDecimal,其值为 (this / divisor),其标度为 this.scale()。如果必须执行舍入,以生成具有给定标度的结果,则应用指定的舍入模式。
- BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) 返回一个 BigDecimal,其值为 (this / divisor),其标度为指定标度。如果必须执行舍入,以生成具有指定标度的结果,则应用指定的舍入模式。相对于此遗留方法,应优先使用新的 divide(BigDecimal, int, RoundingMode) 方法。
- BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) 返回一个 BigDecimal,其值为 (this / divisor),其标度为指定标度。如果必须执行舍入,以生成具有指定标度的结果,则应用指定的舍入模式。
取余和取整
- BigDecimal divideToIntegralValue(BigDecimal divisor) 返回 BigDecimal,其值为向下舍入所得商值(this / divisor)的整数部分。该结果的首选标度为(this.scale() - divisor.scale())。
- BigDecimal remainder(BigDecimal divisor) 返回其值为 (this % divisor) 的 BigDecimal。余数由 this.subtract( this.divideToIntegralValue(divisor) .multiply(divisor) ) 给出。注意,这不是模操作(结果可以为负)。
- BigDecimal[] divideAndRemainder(BigDecimal divisor) 返回由两个元素组成的 BigDecimal 数组,该数组包含 divideToIntegralValue 的结果,后跟对两个操作数计算所得到的 remainder。注意,如果同时需要整数商和余数,则此方法比分别使用 divideToIntegralValue 和 remainder 方法更快速,因为相除仅需执行一次。
- BigDecimal remainder(BigDecimal divisor, MathContext mc)
- BigDecimal divideToIntegralValue(BigDecimal divisor, MathContext mc)
- BigDecimal[] divideAndRemainder(BigDecimal divisor, MathContext mc)
BigDecimal bd1 = BigDecimal.valueOf(5);
BigDecimal bd2 = BigDecimal.valueOf(2);
BigDecimal bd_div = bd1.divide(bd2);//商
BigDecimal bd_dti = bd1.divideToIntegralValue(bd2);//向下舍入所得商值(this / divisor)的整数部分
BigDecimal bd_tem = bd1.subtract(bd1.divideToIntegralValue(bd2).multiply(bd2));//remainder计算的过程
BigDecimal bd_rem = bd1.remainder(bd2);//返回其值为 (this % divisor) 的 BigDecimal。注意,这不是模操作(结果可以为负)
System.out.println(bd_div + " " + bd_dti + " " + bd_tem + " " + bd_rem + " " + bd_tem.equals(bd_rem));//2.5 2 1 1 true
BigDecimal[] array = bd1.divideAndRemainder(bd2);
System.out.println(Arrays.toString(array) + " " + array[0].equals(bd_dti) + " " + array[1].equals(bd_rem));//[2, 1] true true
绝对值、正负值
- BigDecimal abs() 返回 BigDecimal,其值为此 BigDecimal 的绝对值,其标度为 this.scale()。
- BigDecimal negate() 返回 BigDecimal,其值为 (-this),其标度为 this.scale()。
- BigDecimal plus() 返回 BigDecimal,其值为 (+this),其标度为 this.scale()。此方法仅返回此 BigDecimal,该方法与一元减方法 negate() 对称
- BigDecimal abs(MathContext mc) 返回其值为此 BigDecimal 绝对值的 BigDecimal(根据上下文设置进行舍入)。
- BigDecimal negate(MathContext mc) 返回其值为 (-this) 的 BigDecimal(根据上下文设置进行舍入)。
- BigDecimal plus(MathContext mc) 返回其值为 (+this) 的 BigDecimal(根据上下文设置进行舍入)。此方法的效果与 round(MathContext) 方法的效果相同。
其他返回BigDecimal的方法
- BigDecimal max(BigDecimal val) 返回此 BigDecimal 和 val 的最大值。根据 compareTo 方法的定义,如果它们相等,则返回 this。
- BigDecimal min(BigDecimal val) 返回此 BigDecimal 和 val 的最小值。根据 compareTo 方法的定义,如果它们相等,则返回 this。
【移动小数点】
- BigDecimal movePointLeft(int n) 返回一个 BigDecimal,它等效于将该值的小数点向左移动 n 位。如果 n 为非负数,则调用仅将 n 添加到该标度。如果 n 为负数,则该调用等效于 movePointRight(-n)。此调用返回的 BigDecimal 的值为 (this * 10^-n),标度为 max(this.scale()+n, 0)。
- BigDecimal movePointRight(int n) 返回一个 BigDecimal,它等效于将该值的小数点向右移动 n 位。如果 n 为非负数,则该调用仅从该标度减去 n。如果 n 为负,则该调用等效于 movePointLeft(-n)。此调用返回的 BigDecimal 的值为 (this * 10^n),标度为 max(this.scale()-n, 0)。
【其他方法】
- BigDecimal stripTrailingZeros() 返回数值上等于此小数,但从该表示形式移除所有尾部零的 BigDecimal。
- BigDecimal ulp() 返回此 BigDecimal 的 ulp(最后一位的单位)的大小。
- BigDecimal round(MathContext mc) 返回根据 MathContext 设置进行舍入后的 BigDecimal。如果精度设置为 0,则不进行任何舍入操作。此方法的效果与 plus(MathContext) 方法的效果相同。
转换为基本数据类型
- int intValue() 将此 BigDecimal 转换为 int。此转换类似于 Java Language Specification 中定义的从 double 到 short 的 基本收缩转换:将丢弃此 BigDecimal 的所有小数部分,并且如果生成的 " BigInteger" 太大而不适合用 int 表示,则仅返回 32 位低位字节。注意,此转换会丢失关于此 BigDecimal 值的总大小和精度的信息,并返回带有相反符号的结果。
- long longValue() 将此 BigDecimal 转换为 long。此转换类似于 Java Language Specification 中定义的从 double 到 short 的 基本收缩转换:将丢弃此 BigDecimal 的小数部分,并且如果生成的 " BigInteger" 太大而不适合用 long 表示,则仅返回 64 位低位字节。注意,此转换会丢失关于此 BigDecimal 值的总大小和精度的信息,并返回带有相反符号的结果。
- float floatValue() 将此 BigDecimal 转换为 float。此转换类似于 Java Language Specification 中定义的从 double 到 float 的 基本收缩转换:如此 BigDecimal 的值太大而不能表示为 float,则将其适当地转换为 Float.NEGATIVE_INFINITY 或 Float.POSITIVE_INFINITY。注意,即使在返回值为有限值的情况下,此转换也可能丢失关于 BigDecimal 值精度的信息。
- double doubleValue() 将此 BigDecimal 转换为 double。此转换类似于 Java Language Specification 中定义的从 double 到 float 的 基本收缩转换:如果此 BigDecimal 的数量太大而不能表示为 double,则将其适当地转换为 Double.NEGATIVE_INFINITY 或 Double.POSITIVE_INFINITY。注意,即使在返回值为有限值的情况下,此转换也可能丢失关于 BigDecimal 值精度的信息。
- byte byteValueExact() 将此 BigDecimal 转换为 byte,以检查丢失的信息。如果此 BigDecimal 具有非零小数部分,或者超出 byte 结果的可能范围,则抛出 ArithmeticException。
- short shortValueExact() 将此 BigDecimal 转换为 short,以检查丢失的信息。如果此 BigDecimal 具有非零小数部分,或者超出 short 结果的可能范围,则抛出 ArithmeticException。
- int intValueExact() 将此 BigDecimal 转换为 int,以检查丢失的信息。如果此 BigDecimal 具有非零小数部分,或者超出 int 结果的可能范围,则抛出 ArithmeticException。
- long longValueExact() 将此 BigDecimal 转换为 long,以检查丢失的信息。如果此 BigDecimal 具有非零小数部分,或者超出 long 结果的可能范围,则抛出 ArithmeticException。
BigDecimal bd = BigDecimal.ONE.scaleByPowerOfTen(18);
System.out.println(Long.MAX_VALUE + " " + (Long.MAX_VALUE + "").length());//9223372036854775807 19
System.out.println(bd.longValue() + " " + bd.longValueExact() + " " + (bd.longValue() + "").length());//1000000000000000000 1000000000000000000 19
BigDecimal bd2 = BigDecimal.ONE.scaleByPowerOfTen(19);
System.out.println(bd2 + " " + bd2.longValue()+ " " + bd2.doubleValue());//1E+19 -8446744073709551616 1.0E19
try {
System.out.println(bd2.longValueExact());
} catch (Exception e) {
e.printStackTrace();
System.out.println("如果此 BigDecimal 具有非零小数部分,或者超出 long 结果的可能范围,则抛出 ArithmeticException");
}
字符串表示形式
- String toString() 返回此 BigDecimal 的字符串表示形式,如果需要指数,则使用【科学记数法】。
- String toEngineeringString() 返回此 BigDecimal 的字符串表示形式,需要指数时,则使用【工程计数法】。
- 返回如 toString() 方法中所描述的表示 BigDecimal 的字符串,不包括使用指数记数法的情况,将十的幂调整为三的倍数(工程记数法),这样,非零值的整数部分的范围是 1 到 999。如果对零值使用指数记数法,则使用小数点和小数的一(或二)个零数字,以便保留零值的标度。
- String toPlainString() 返回【不带指数字段】的此 BigDecimal 的字符串表示形式。

转换为BigInteger
- BigInteger toBigInteger() 将此 BigDecimal 转换为 BigInteger。
- BigInteger toBigIntegerExact() 将此 BigDecimal 转换为 BigInteger,以检查丢失的信息。
- BigInteger unscaledValue() 返回其值为此 BigDecimal 的非标度值 的 BigInteger。计算 (this * 10^this.scale())。
重载自Object的方法
- int compareTo(BigDecimal val) 将此 BigDecimal 与指定的 BigDecimal 比较。
- int hashCode() 返回此 BigDecimal 的哈希码。
- boolean equals(Object x) 比较此 BigDecimal 与指定的 Object 的相等性。
BigDecimal 小数 浮点数 精度 财务计算的更多相关文章
- 浮点数运算结果不精确,以及用String来构造BigDecimal进行浮点数精确计算
1.浮点数运算结果不精确 先看如下代码 System.out.println(1.0 - 0.8); System.out.println(0.2 + 0.1); System.out.println ...
- java中小数的处理:高精度运算用bigDecimal类,精度保留方法,即舍入方式的指定
一. 计算机的小数计算一定范围内精确,超过范围只能取近似值: 计算机存储的浮点数受存储bit位数影响,只能保证一定范围内精准,超过bit范围的只能取近似值. java中各类型的精度范围参见:http: ...
- js浮点数精度丢失问题及如何解决js中浮点数计算不精准
js中进行数字计算时候,会出现精度误差的问题.先来看一个实例: console.log(0.1+0.2===0.3);//false console.log(0.1+0.1===0.2);//true ...
- 计算价格, java中浮点数精度丢失的解决方案
计算价格, java中浮点数精度丢失的解决方案
- Java 浮点数精度丢失
Java 浮点数精度丢失 问题引入 昨天帮室友写一个模拟发红包抢红包的程序时,对金额统一使用的 double 来建模,结果发现在实际运行时程序的结果在数值上总是有细微的误差,程序运行的截图: 输入依次 ...
- float、double、BigDecimal的一些精度问题
float f = 280.8f;System.out.println(f*100);结果是什么?结果是:28080.0f(我是这么想的)实际结果是:28079.998 既然float处理有问题换do ...
- WebGL着色器32位浮点数精度损失问题
问题 WebGL浮点数精度最大的问题是就是因为js是64位精度的,js往着色器里面穿的时候只能是32位浮点数,有效数是8位,精度丢失比较严重. 这篇文章里讲了一些处理方式,但是视坐标这种方式放在我们的 ...
- java浮点数精度问题解决方法
基础知识回顾: BigDecimal.setScale()方法用于格式化小数点setScale(1)表示保留一位小数,默认用四舍五入方式 setScale(1,BigDecimal.ROUND_DOW ...
- 你不知道的JavaScript--Item2 浮点数精度
理解JavaScript的浮点数 大多数编程语言都有几种数值型数据类型,但是JavaScript却只有一种.你可以使用typeof 运算符查看数字的类型.不管是整数还是浮点数,JavaScript都将 ...
随机推荐
- My blog in AI ---神经网络,神经元(neural network,nervecell)
尽管我们有很多经验丰富的软件开发人员,但是利用hard code的方法,要解决一些问题,我们的程序员还是优点捉襟见肘,这些问题包括,识别手写数字照片上的数字:分辨一张彩色照片上是否有一只猫咪:准确理解 ...
- Git 码云操作
https://www.cnblogs.com/lanxiang/p/7487971.html 将项目提交到码云 在码云创建项目 然后在项目目录下: 打开后输入: git init 目录下出现.git ...
- Initramfs 原理和实践
Linux系统启动时使用initramfs (initram file system), initramfs可以在启动早期提供一个用户态环境,借助它可以完成一些内核在启动阶段不易完成的工作.当然ini ...
- [leetcode DP]53. Maximum Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- php常见网络攻击及防御方法
常见的Web攻击分为两类:一是利用Web服务器的漏洞进行攻击,如CGI缓冲区溢出,目录遍历漏洞利用等攻击;二是利用网页自身的安全漏洞进行攻击,如SQL注入,跨站脚本攻击等.下面这篇文章主要介绍了PHP ...
- 2017-2018-1 JAVA实验站 第六、七周作业
2017-2018-1 JAVA实验站 第六.七周作业 详情请见团队博客
- bzoj 2850
比较基础的KD树.每个节点维护一个BOX,包含包含当当前子树的点的最小矩形,以及点权和,然后用“整个矩形都在直线的一侧”和“整个矩形都不在直线的一侧”剪枝. /******************** ...
- python开发_tkinter_自己做的猜数字小程序
读到这篇文章[python 3.3下结合tkinter做的猜数字程序]的时候,就复制了代码,在自己机器上面跑了一下 源程序存在一个缺陷: 即当用户答对了以后,用户再点击'猜'按钮,最上面的提示标签还会 ...
- hdoj 4445 Crazy Tank 物理题/枚举角度1
Crazy TankTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- Ubuntu下(Linux+Apache+MYSQL+PHP, LAMP)环境搭建
近期開始玩PHP,于是试着搭建一下开发环境并做个记录,以备日后再使用起来方便可查. 第一步 确保软件包是最新的 sudo apt-get update 第二步 安装Apache2 sudo apt-g ...