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都将 ...
随机推荐
- 使用GIT进行源码管理——GUI客户端
很多人对GIT GUI客户端是非常不屑一顾的,但我非常喜欢GUI的方便快捷,也不用记忆冗杂的命令,本文简单的介绍了几种免费的Windows下的GIT客户端,方便大家使用. Git for Window ...
- Error after SQL Server 2012 installation: Login Failure for "SQL Server Integration Services 11.0" SSIS service
When you install SQL Server 2012 and you try to connect to SSIS services, you cannot due to that the ...
- 数据准备<5>:变量筛选-实战篇
在上一篇文章<数据准备<4>:变量筛选-理论篇>中,我们介绍了变量筛选的三种方法:基于经验的方法.基于统计的方法和基于机器学习的方法,本文将介绍后两种方法在Python(skl ...
- CF696B Puzzles 期望
显然可以树形$dp$ 令$f[i]$表示$i$号节点的期望时间戳 不妨设$fa$有$k$个子节点,对于$i$的子节点$u$,它是第$j(1 \leqslant j \leqslant k)$个被访问的 ...
- BZOJ 2959: 长跑 lct 双联通分量 并查集 splay
http://www.lydsy.com/JudgeOnline/problem.php?id=2959 用两个并查集维护双联通分量的编号和合并. #include<iostream> # ...
- [CC-CHEFINV]Chef and Swaps
[CC-CHEFINV]Chef and Swaps 题目大意: 长度为\(n(n\le2\times10^5)\)的数列,\(q(q\le2\times10^5)\)次询问,每次问交换\(A_x\) ...
- FindWindow和FindWindowEx
函数原型:FindWindow(lpszClassName,lpszWindowName) 参数:lpszClassName--窗口类名;lpszWindowName--窗口标题 功能:查找窗口,未找 ...
- 解决CIFilter滤镜后图片大小和方向发生变化
调用contextWithOptions:和createCGImage: fromRect:方法创建CIContext.与以往不同的地方是CIImage没有frame与bounds属性:只有exten ...
- 封装libsvm成可程序调用的C/C++类
libsvm很早之前就用了,现在封装一下方便自己使用,也方便大家更快的使用这个库,这个库一个挺有用的特性就是对测试样本的概率估计.源码在随笔的最后.liblinear的版本也是类似移植,主要是处理好数 ...
- MacBook pro new 触控板手势及快捷键
MacBook pro new 触控板手势: 显示桌面: 拇指+三指 向外张开 launchpad: 拇指+三指 向中间集中 正在运行的窗口:三指向上 应用浏览: 三指向下 窗口信息: 三指点 ...