电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

关于BigDecimal的不精确计算问题


发布日期:2020/4/1
 

关于BigDecimal 的不精确计算问题

view plaincopy to clipboardprint?

public static void main(String[] args){

BigDecimal bg = new BigDecimal();

BigDecimal bg = new BigDecimal();

BigDecimal bg = bgmultiply(bg);

Systemoutprintln(bg);

}

public static void main(String[] args){

BigDecimal bg = new BigDecimal();

BigDecimal bg = new BigDecimal();

BigDecimal bg = bgmultiply(bg);

Systemoutprintln(bg);

}

输入结果为

实际结果应为

现在作了如下函数可以解决一部分处理但是测试时有些case还是有不精确的时候

比如 E相乘 scale设置为的时候小数部分并不全为零

public static int getLongLength(BigDecimal numericalValue){

String sNumericalValue = numericalValuetoPlainString();

String[] arrayValues = { };

if (!(sNumericalValueindexOf() < )) {

arrayValues = sNumericalValuesplit(\\);

} else {

arrayValues[] = sNumericalValue;

}

if(arrayValues[ntains()){

arrayValues[] = arrayValues[]replaceAll( );

}

int intLength = arrayValues[]length();

return intLength;

}

public static BigDecimal muliply(BigDecimal bgBigDecimal bgint scaleRoundingMode roundingMode){

BigDecimal result = bgmultiply(bg);

int intLength = getLongLength(result);

MathContext context = new MathContext(intLength+scaleroundingMode);

result = resultround(context);

return result;

}

public static int getLongLength(BigDecimal numericalValue){

String sNumericalValue = numericalValuetoPlainString();

String[] arrayValues = { };

if (!(sNumericalValueindexOf() < )) {

arrayValues = sNumericalValuesplit(\\);

} else {

arrayValues[] = sNumericalValue;

}

if(arrayValues[ntains()){

arrayValues[] = arrayValues[]replaceAll( );

}

int intLength = arrayValues[]length();

return intLength;

}

public static BigDecimal muliply(BigDecimal bgBigDecimal bgint scaleRoundingMode roundingMode){

BigDecimal result = bgmultiply(bg);

int intLength = getLongLength(result);

MathContext context = new MathContext(intLength+scaleroundingMode);

result = resultround(context);

return result;

}需要特别指出的是 numericalValuetoPlainString(); toPlainString() 不会返回XXEXX的科学技术法的形式

上一篇:手动解析snmp的dateAndTime类型

下一篇:为什么匿名内部类参数必须为final类型