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

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

解题思路:

思路其实很简单,暴力求解就可以,但是当你写了一个四重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使用BigDecimal解决精确计算的问题的更多相关文章

  1. 使用BigDecimal进行精确计算工具类

    package com.develop.util; import java.math.BigDecimal; import java.math.RoundingMode; public class M ...

  2. Java使用BigDecimal解决浮点型运算丢失精度的问题

    @Test public void test1(){ System.out.print(0.05+0.01); } @Test public void test2(){ BigDecimal b1 = ...

  3. Java BigDecimal进行精确计算

    前言 float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果,所以 ...

  4. Java浮点数float,bigdecimal和double精确计算的精度误差问题总结

    (转)Java浮点数float,bigdecimal和double精确计算的精度误差问题总结 1.float整数计算误差 案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结 ...

  5. JAVA中精确计算金额BigDecimal

    package com.chauvet.utils; import java.math.BigDecimal; import java.text.DecimalFormat; import java. ...

  6. 解决java计算中double类型结果不一致问题,使用BigDecimal解决

    一.需求:从数据表中读出一个double的数据,比如是3.5,没问题,但是如果再用3.5进行计算,比如乘以100,结果就是350了,而是35000000004 因为是浮点运算,所有语言中的浮点数都会有 ...

  7. java的数字精确计算问题-BigDecimal

    java的数字运算,偶尔会出现精度的问题,以下阐述的 java的BigDecimal类的使用. 例如: System.out.println(0.9+0.3); 结果1.2 System.out.pr ...

  8. Java使用BigDecimal精确计算的简单公式计算器

    由于工作需要,写了一个使用BigDecimal运算的精确计算的计算器(然后发现其实比不用BigDecimal的并好不到哪里去) 只能做加减乘除 double类型的数字在千万级别的时候会转成科学计数法, ...

  9. java精确除法计算,四舍五入 Java问题通用解决代码

    主要用java.math.BigDecimal工具类实现,想要了解BigDecimal类可以看java api   正式版:        public static Double divide() ...

随机推荐

  1. Code Forces 645A Amity Assessment

    A. Amity Assessment time limit per test2 seconds memory limit per test256 megabytes inputstandard in ...

  2. 关于ln(link)命令

    一. ln分为硬链接和软链接. 二. 硬链接命令为: ln test/a.text hard.text 1. 这样hard.text拥有 test目录下a.text相同的i节点(inode的id号)和 ...

  3. setMasksToBounds

    setMasksToBounds 在IB中,当你使用Custom类型的Button时,你可以指定按钮的背景色.但当你运行时按钮就失去了圆角特性,你看到的仅仅是一个方块.因为custombutton没有 ...

  4. Pulsar

    The Apache Software Foundation Announces Apache® Pulsar™ as a Top-Level Project : The Apache Softwar ...

  5. golang环境安装

    到官方https://golang.org/dl/下载安装包 cd /usr/local/src wget https://storage.googleapis.com/golang/go1.8.li ...

  6. SpringBoot-基于Maven工程使用SpringBoot

    Spring Boot SpringBoot是一个社区反馈推动的项目.SpringBoot可以说是至少五年来Spring乃至整个Java社区最有影响力的项目之一.SpringBoot主要包括以下特性: ...

  7. MySQL DBA的修炼与未来(参考篇)

    转自:https://blog.csdn.net/xielingshao/article/details/77840101 MySQL DBA的修炼与未来 随着MySQL地位爆炸式的提升, MySQL ...

  8. 生信-RPKM与FPKM学习[转载]

    转自:https://baike.baidu.com/item/RPKM/1197657 均反应基因的表达水平 1.RPKM的计算公式 分母是总共比对到这个基因的reads的数目(条 为单位),分母是 ...

  9. Flask组件 flask_session

    flask-session是flask框架的session组件,由于原来flask内置session使用签名cookie保存,该组件则将支持session保存到多个地方,如: redis memcac ...

  10. windows的cmd命令切换磁盘路径