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

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

解题思路:

思路其实很简单,暴力求解就可以,但是当你写了一个四重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. [Gradle] 针对不同的项目类型应用不同的 findbugs 配置

    build.gradle in project root subprojects { subProject -> plugins.withId('com.android.application' ...

  2. style、currentStyle、getComputedStyle(不同浏览器获取css样式)区别介绍

    style.currentStyle.getComputedStyle区别介绍   样式表有三种方式 内嵌样式(inline Style) :是写在Tag里面的,内嵌样式只对所有的Tag有效. 内部样 ...

  3. python学习笔记(三)— 文件操作

    对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句柄操作文件 3.关闭文件. 现有以下文件a.txt: 登鹳雀楼 唐代:王之涣 白日依山尽,黄河入海流. 一.文件基 ...

  4. 剑指Offer——平衡二叉树

    题目描述: 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 分析: 平衡二叉树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质 ...

  5. ISO C++标准委员会不是一个一般意义上权力机构,基本上愿意交会费,愿意自己出时间,出酒店机票,出提案,就可以申请加入。

    ISO C++标准委员会不是一个一般意义上权力机构,基本上愿意交会费,愿意自己出时间,出酒店机票,出提案,每年全世界参加会议被专家巨细靡遗地评头论足,就可以申请加入. 所以参加标准委员会背景各异,有人 ...

  6. access join形式删除数据

    --注意distinctrow关键字 delete distinctrow a.* from aa a inner join bb b on a.id= b.id  

  7. mysql 约束条件 auto_increment 自动增长 修改自增字段起始值

    创建一张表 t20 mysql) ); Query OK, rows affected (0.01 sec) mysql> desc t20; +-------+----------+----- ...

  8. 9.如何让ubuntu的ssh免密码登录

    ubuntu 默认已安装了 SSH client,此外还需要安装 SSH server: sudo apt-get install openssh-server 安装后,可以使用如下命令登陆本机: s ...

  9. sipp模拟freeswitch分机测试(SIP协议调试)

    1.freeswitch安装 1) 网上很多安装方法都不靠谱,系统版本,各种依赖库一堆问题,下面是验证的可行的. yum install -y http://files.freeswitch.org/ ...

  10. Jmeter(五)mysql的增删改查

    一.导入jdbc的jar包,因为jmeter本身不能直接连接mysql,所以需要导入第三方的jar包,来连接mysql jar包下载地址:https://pan.baidu.com/s/17qQZPF ...