java中写了一个简单计算器,计算0.3*3=0.8999...,有人说要用BigDecimal 类请问要怎么使用最好写一下代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中写了一个简单计算器,计算0.3*3=0.8999...,有人说要用BigDecimal 类请问要怎么使用最好写一下代码相关的知识,希望对你有一定的参考价值。

代码如下:
double d = 0.3;
BigDecimal bd = new BigDecimal(d+"");
BigDecimal bd2 = new BigDecimal(3);
System.out.println(bd.multiply(bd2));
------------
需要注意的是, BigDecimal bd = new BigDecimal(d+"");构造函数要传String类型,如果传double类型的话,结果也是0.8999........
参考技术A double money =2;
double price =1.1;
double result = money - price;
System.err.println("非精确计算="+result);
//精确计算
BigDecimal m = new BigDecimal("2");
BigDecimal p = new BigDecimal("1.1");
BigDecimal del = m.subtract(p);
BigDecimal add= m.add(p);
BigDecimal cheng = m.multiply(p);
//BigDecimal div = m.divide(p);
System.err.println("精确计算="+del);
System.err.println("精确计算="+add);
System.err.println("精确计算="+cheng);

Java使用BigDecimal解决精确计算的问题

最近有人在微信上给我发了一个数学题目,如下图:

我看了之后感觉很是简单,但是却想了半天才解出来。解出来后我想到了用程序再解一遍,然而精确计算的问题却让人头疼不已。

解题思路:

思路其实很简单,暴力求解就可以,但是当你写了一个四重for循环后你会发现解不出来。由此考虑到结果可能是小数,便把增量改成了float类型,每次自增0.1。

当你写完满心欢喜地运行的时候会发现还是出不来结果。再改成double类型也同样是不行。

这是因为java中float类型相加是把十进制转化为二进制后相加然后把二进制结果再转化成十进制。

于是使用java中自带的BigDecimal类进行计算。

当然使用BigDecimal类与值类型的int、float等有所不同。

1、声明一个BigDecimal

  BigDecimal b1=new BigDecimal("10");

这样就声明了一个引用b1指向值为10的BigDecimal对象。注意,BigDecimal的构造方法中的值为String类型。

2、BigDecimal的加减

  add:

import java.math.BigDecimal;

public class test3 {
	public static void main(String[] args) {
		BigDecimal b1=new BigDecimal("1.12");
		BigDecimal b2=new BigDecimal("2.14");
		System.out.println(b1.add(b2));
	}
}

  运行结果为:3.26

  substract:

import java.math.BigDecimal;

public class test4 {
	public static void main(String[] args) {
		BigDecimal b1=new BigDecimal("1.12");
		BigDecimal b2=new BigDecimal("2.14");
		System.out.println(b1.subtract(b2));
	}
}

  运行结果为:-1.02

  PS:乘和除也有对应的方法,此处不再展示。

 

3、BigDecimal的for循环 

import java.math.BigDecimal;

public class test3 {
	public static void main(String[] args) {
		for(BigDecimal b1=new BigDecimal("1.0");
				b1.compareTo(new BigDecimal("5"))!=1;
				b1=b1.add(new BigDecimal("0.1"))){
			System.out.println(b1);
		}
	}
}

  使用BigDecimal做for循环需要使用BigDecimal中的compareTo方法做判断。compareTo方法判断为true会返回1,否则返回0。

4、解题方法

import java.math.BigDecimal;

public class test2 {
	public static void main(String[] args) {
		for (BigDecimal a = new BigDecimal("0"); 
				a.compareTo(new BigDecimal("10")) != 1; 
				a = a.add(new BigDecimal("0.1"))) {
			for (BigDecimal b = new BigDecimal("0"); 
					b.compareTo(new BigDecimal("10")) != 1; 
					b = b.add(new BigDecimal("0.1"))) {
				for (BigDecimal c = new BigDecimal("0"); 
						c.compareTo(new BigDecimal("10")) != 1;
						c = c.add(new BigDecimal("0.1"))) {
					for (BigDecimal d = new BigDecimal("0"); 
							d.compareTo(new BigDecimal("10")) != 1; 
							d = d.add(new BigDecimal("0.1"))) {
						if ((a.add(b)).equals(new BigDecimal("9.0"))
								&& b.add(d).equals(new BigDecimal("10.0"))
								&& a.add(c).equals(new BigDecimal("10.0"))
								&& c.subtract(d).equals(new BigDecimal("6.0")) ) 
							System.out.println(a + "| " + b + " |  " + c + " | " + d);
					}
				}
			}
		}
		
	}
}

  恐怖的四重BigDecimal的for循环。

  运行结果:1.5| 7.5 |  8.5 | 2.5

 

以上是关于java中写了一个简单计算器,计算0.3*3=0.8999...,有人说要用BigDecimal 类请问要怎么使用最好写一下代码的主要内容,如果未能解决你的问题,请参考以下文章

java(第二周:计算)

java,js中小数计算精度误差问题

解决js计算0.1+0.2 !==0.3

计算 3↑↑↑3(在 Python 中)

从0.1 + 0.2 !== 0.3 聊聊计算机基础

js 小数加法的精度问题解决(0.1+0.2 != 0.3,怎么解决?)