java.math.BinInteger和java.math.BigDecimal

基于STM32的汽车主门电动窗开关系统设计方案 以下是基于 STM32CubeMX 和 HAL 库的示例代码,可实现基本的功能。 阅读详情

 如果我们编译运行下面这个程序会看到什么?   
  public   class   Test{   
          public   static   void   main(String   args[]){   
                  System.out.println(0.05+0.01);   
                  System.out.println(1.0-0.42);   
                  System.out.println(4.015*100);   
                  System.out.println(123.3/100);   
          }   
  };   
  //你没有看错!结果确实是   
  //0.060000000000000005   
  //0.5800000000000001   
  //401.49999999999994   
  //1.2329999999999999 
Java中的简单浮点数类型float和double不能够进行运算。不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上面的错误。现在终于理解为什么要有BCD码了。这个问题相当严重,如果你有9.999999999999元,你的计算机是不会认为你可以购买10元的商品的。在有的编程语言中提供了专门的货币类型来处理这种情况,但是Java没有。现在让我们看看如何解决这个问题。  
我们的第一个反应是做四舍五入。Math类中的round方法不能设置保留几位小数,我们只能象这样(保留两位):   
  public   double   round(double   value){   
          return   Math.round(value*100)/100.0;   
  } 
非常不幸,上面的代码并不能正常工作,给这个方法传入4.015它将返回4.01而不是4.02,如我们在上面看到的   
4.015*100=401.49999999999994   
因此如果我们要做到精确的四舍五入,不能利用简单类型做任何运算   
java.text.DecimalFormat也不能解决这个问题:
System.out.println(new java.text.DecimalFormat("0.00").format(4.025));
输出是4.02  

在《Effective   Java》这本书中也提到这个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用java.math.BigDecimal。BigDecimal一共有4个够造方法,我们不关心用BigInteger来够造的那两个,那么还有两个,它们是:
BigDecimal(double   val) //Translates   a   double   into   a   BigDecimal.     
BigDecimal(String   val) //Translates   the   String   repre   sentation   of   a   BigDecimal   into   a   BigDecimal. 
上面的API简要描述相当的明确,而且通常情况下,上面的那一个使用起来要方便一些。
但是我们如果需要精确计算,非要用String来够造BigDecimal不可!在《Effective   Java》一书中的例子是用String来够造BigDecimal的,但是书上却没有强调这一点。
 解决方案  :
现在我们已经可以解决这个问题了,原则是使用BigDecimal并且一定要用String来够造。   
下面我们提供一个工具类Arith来简化操作。它提供以下静态方法,包括加减乘除和四舍五入:   
  public   static   double   add(double   v1,double   v2)   
  public   static   double   sub(double   v1,double   v2)   
  public   static   double   mul(double   v1,double   v2)   
  public   static   double   div(double   v1,double   v2)   
  public   static   double   div(double   v1,double   v2,int   scale)   
  public   static   double   round(double   v,int   scale) 
在java中提供了大数字的操作类,即java.math.BinInteger类和java.math.BigDecimal类。这两个类用于高精度计 算,其中BigInteger类是针对大整数的处理类,而BigDecimal类则是针对大小数的处理类。下边我们介绍BigDecimal类: 
BigDecimal的实现利用到了BigInteger,不同的是BigDecimal加入了小数的概念。一般的float型和Double型数据只可 以用来做科学计算或者是工程计算,由于在商业计算中,要求的数字精度比较高,所以要用到java.math.BigDecimal类,它支持任何精度的定 点数,可以用它来精确计算货币值。

BigInteger属于java.math.BigInteger,因此在每次使用前都要import 这个类。
三个经常用到的函数:
BigInteger remainder(BigInteger val)  // 返回其值为 (this % val) 的 BigInteger 
BigInteger negate()                   // 返回其值是 (-this) 的 BigInteger
int   compareTo(BigInteger val)       //  将此 BigInteger 与指定的 BigInteger 进行比较
compareTo的详解如下: 
将此 BigInteger 与指定的 BigInteger 进行比较。对于针对六个布尔比较运算符 (<, ==, >, >=, !=, <=) 中的每一个运算符的各个方法,优先提供此方法。执行这些比较的建议语句是:(x.compareTo(y) <op> 0),其中 <op> 是六个比较运算符之一。

import java.math.BigDecimal;  
/** 
 * @author Jstar  
 */  
public class Arith {  
      
    // 默认除法运算精度  
    private static final int DEF_DIV_SCALE = 10;  
  
    // 这个类不能实例化  
    private Arith() {  
          
    }  
    /** 
     * 提供精确的加法运算     
     * @param v1           被加数 
     * @param v2            加数 
     * @return 两个参数的和 
     */  
    public static double add(double v1, double v2) {  
        BigDecimal b1 = new BigDecimal(Double.toString(v1));  
        BigDecimal b2 = new BigDecimal(Double.toString(v2));  
        return b1.add(b2).doubleValue();  
    }  
  
    /** 
     * 提供精确的减法运算 
     
     * @param v1            被减数 
     * @param v2            减数 
     * @return 两个参数的差 
     */  
    public static double sub(double v1, double v2) {  
        BigDecimal b1 = new BigDecimal(Double.toString(v1));  
        BigDecimal b2 = new BigDecimal(Double.toString(v2));  
        return b1.subtract(b2).doubleValue();  
    }  
  
    /** 
     * 提供精确的乘法运算     
     * @param v1            被乘数 
     * @param v2            乘数 
     * @return 两个参数的积 
     */  
    public static double mul(double v1, double v2) {  
        BigDecimal b1 = new BigDecimal(Double.toString(v1));  
        BigDecimal b2 = new BigDecimal(Double.toString(v2));  
        return b1.multiply(b2).doubleValue();  
    }  
  
    /** 
     * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入   
     * @param v1            被除数 
     * @param v2            除数 
     * @return 两个参数的商 
     */  
    public static double div(double v1, double v2) {  
        return div(v1, v2, DEF_DIV_SCALE);  
    }  
  
    /** 
     * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。     
     * @param v1            被除数 
     * @param v2            除数 
     * @param scale         表示表示需要精确到小数点以后几位。 
     * @return 两个参数的商 
     */  
    public static double div(double v1, double v2, int scale) {  
        if (scale < 0) {  
            throw new IllegalArgumentException(  
                    "The scale must be a positive integer or zero");  
        }  
        BigDecimal b1 = new BigDecimal(Double.toString(v1));  
        BigDecimal b2 = new BigDecimal(Double.toString(v2));  
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();  
    }  
  
    /** 
     * 提供精确的小数位四舍五入处理。   
     * @param v           需要四舍五入的数字 
     * @param scale       小数点后保留几位 
     * @return 四舍五入后的结果 
     */  
    public static double round(double v, int scale) {  
        if (scale < 0) {  
            throw new IllegalArgumentException(  
                    "The scale must be a positive integer or zero");  
        }  
        BigDecimal b = new BigDecimal(Double.toString(v));  
        BigDecimal one = new BigDecimal("1");  
        return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();  
    }  
}  
金额的数据类型是BigDecimal 
通过BigDecimal的divide方法进行除法时当不整除,出现无限循环小数时,就会抛异常的,异常如下:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. at java.math.BigDecimal.divide(Unknown Source) 
应用场景:一批中供客户的单价是1000元/年,如果按月计算的话1000/12=83.3333333333.... 
解决之道:就是给divide设置精确的小数点divide(xxxxx,2, BigDecimal.ROUND_HALF_EVEN) 



华为OD机试新系统真题【字符串压缩编码】 华为OD机试 新系统真题【字符串压缩编码】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【字符串压缩编码】多语言题解 阅读详情

相关推荐

墨刀原型设计工具操作使用指南及实践操作

该指南通过异常场景处理、像素级参数说明、复杂交互示例,覆盖了墨刀操作的全细节,适合从新手到资深用户的进阶学习。结合 PlantUML 思维导图的层级化展示,可快速定位具体功能的操作要点与问题解决方法,真正实现 “照指南即可操作” 的实用价值。

hy行者勇哥的博客 4950

java -- Math、BigInteger、BigDecimal类和基本类型的包装类、正则表达式

java.lang.Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。类似这样的工具类,其所有方法均为静态方法

weixin_44966435的博客 193

World Creator地形导入UE

导出预设选择高度图(heigh map)格式选择PNG 16位,或者RAW 16位,需要反转y轴(与虚幻不同),命名格式会自动带一个× , 将×改成_ 或者删掉自己命名 (虚幻名称不支持x符号)导入虚幻 , 修改Z轴 , 就是用 地形最高 - 地形最低 , 然后除以512 , 再乘以100。把这个数字填入Z轴缩放 , 点击生成即可。

UE星空 2155

浅谈java中的Math类,Integer类,System类的认识

java Integer类 1.Integer类位于java.lang包中,Integer 类对象包含一个 int 类型的字段,还提供了一些能在int类型和String类型之间转换的方法,还有一些方法能将整数转换为二进制,八进制和十六进制。 2.Integer中的两个构造方法: public Integer(int value); public Integer(String s); 3.类方法...

weixin_44614754的博客 428

SAP 财务快速记账之—G/L Item Fast Entry

SAP FICO 运维解决方案

lijinbao171022的博客 1647

lgv20刷twrp_LG港版v20 root

这是LG港版v20 root,整理了一下有关LG港版v20的官方固件包了,有没有需要的呢,这里把固件包整理一下也是方便大家以后好下载了,因此有一些机友还是不知道在哪里下载官方的rom包,在这里说的固件rom包也就是原版的系统包了,大家可以放心的使用,这些系统包也都是支持线刷的,大家下载下来解压出来根据里面的相关教程来操作就可以了,很简单的,如果你也需要的话就一起来看看吧。软件提示注意!! 此过程会...

weixin_33212263的博客 5387

Java中System类、Integer类、Math类学习

文章目录System类1.基本字段(field)2. 常用方法(method)**arraycopy**currentTimeMillisgcexitMath类1.基本字段(filed) System类 System类包含几个有用的类字段和方法。它不能被实例化。 系统类提供的工具包括标准输入、标准输出和错误输出流;访问外部定义的属性和环境变量;加载文件和库的方法;以及快速复制数组一部分的实用方法...

weixin_44798518的博客 396

液晶电视维修必看:TCON逻辑板故障排查全指南(附常见问题解决方案)

本文详细解析了液晶电视TCON逻辑板的工作原理与故障排查方法,涵盖LVDS信号处理、DC-DC电压系统等核心知识。提供从基础测量到高级维修的完整指南,帮助技术人员快速诊断黑屏、竖线等常见故障,并给出预防性维护建议,提升维修效率与成功率。

weixin_42535461的博客 616

java.math.BigDecimal、BinInteger类的用法(用于精确运算)

在java中提供了大数字的操作类,即java.math.BinInteger类和java.math.BigDecimal类。这两个类用于高精度计 算,其中BigInteger类是针对大整数的处理类,而BigDecimal类则是针对大小数的处理类。

813

CorelDraw插件开发-Cdr插件-CPG插件-GMS插件-安装位置

文章目录1.gms格式插件2.cpg格式插件3.作者答疑   CorelDraw软件是一款使用非常广泛的矢量图形软件,系统本身提供了非常便利的二次开发环境,制作插件的格式有两种,一种是gms格式的脚本插件,另外一种是cpg格式dll插件。 1.gms格式插件   gms格式插件是使用微软的 VBA 技术,编写和调试都比较方便,从9的版本开始支持。   安装:把gms文件复制到程序所安装的目录 gms 下,一般在C:\Program Files\Corel\CorelDRAW Graphics Suite 1

插件开发 2752

【教程4>第6章>第15节】 基于I+jQ复数信号的LS信道估计和均衡实现1——matlab仿真分析,QPSK为例

在基于QPSK调制的通信系统中,LS信道估计和均衡是用于补偿信道失真、提高信号传输质量的重要技术。以下将详细介绍基于I+jQ复数信号的 LS 信道估计和均衡的实现原理与过程。可以看到,通过线性插值之后,QPSK信号的星座图可以模糊的看到四个星座点(图2),通过非线性插值之后,可以清晰的看到QPSK的四个星座点(图3)。可以看到,信道均衡显著提高了通信系统的可靠性和有效性。

FPGA/MATLAB学习教程/源码/项目合作开发 657

Java 《Number》类、《Math》类(基础3)

Java Number & Math 类

qq_46598977的博客 1043

基于Simulink进行双向DC-DC变换器的仿真建模

特点双向性:可以将能量从一个电压等级转换到另一个,且方向可逆。效率高:通过合理的控制策略减少能量损失。应用广泛:如电池管理系统、混合动力汽车等。挑战拓扑选择:根据应用场景选择合适的电路结构(如buck-boost、full-bridge等)。控制策略:确保高效稳定运行的同时,适应负载变化。热管理:有效散热以保持长期可靠性。首先明确要模拟的任务内容。设计一个能够支持双向能量传输的变换器。根据输入输出电压要求确定合适的变换器拓扑。实现有效的控制策略来维持输出电压稳定。

xiaoheshang_123的博客 367

java.math.BigDecimal、BinInteger类的用法

在java中提供了大数字的操作类,即java.math.BinInteger类和java.math.BigDecimal类。这两个类用于高精度计算,其中BigInteger类是针对大整数的处理类,而BigDecimal类则是针对大小数的处理类。下边我们介绍BigDecimal类: BigDecimal的实现利用到了BigInteger,不同的是BigDecimal加入了小数的概念。一般的fl

d34588的专栏 521

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java最大精准度类_Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度...

Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算.其中 BigInteger 类是针对大整数的处理类,而 BigDecimal 类则是针对大小数的处理类.BigDecimal 类的实现用到了 BigInteger类,不同的是 BigDecimal 加入了小数的概念.float和Dou...

weixin_28887297的博客 620

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java中java.math.BigInteger用法

摘要:java.math.BigInteger用来表任意大小的整数,内部是用数组来表示数值,此对象最长用的构造器为参数为字符串的构造器,此构造器将参数数值字符串转换BigInteger数值,并且支持“+”、“-” 符号,“+”表示正值,“-”表示负值。但是数值字符串不能包含其他无关字符串

Keep learing, and stay fast 3333

Java中System、Math、Integer类学习总结

System System类提供的System包括标准输入,标准输出和错误输出流; 访问外部定义的属性和环境变量; 一种加载文件和库的方法; 以及用于快速复制阵列的一部分的实用方法。它不能被实例化。 System中常用的方法: 1、 public static long currentTimeMillis() 返回当前时间(以毫秒为单位)。 public class SystemDemo { ...

qq_43556786的博客 313

Java Math、BigInteger、BigDecimal类

Java Math、BigInteger、BigDecimal类1. java.lang.Math2. BigInteger类3. BigDecimal类4. demo 1. java.lang.Math java.lang.Math 提供了一系列静态方法用于科学计算;其方法的参数和返回值类型一般为double型。 - abs 绝对值 - acos,asin,atan,cos,sin,ta...

码农回顾 1197

Java中的java.math.BigInteger

Java中的java.math.BigInteger /** * */ package com.you.model; /** * @author YouHaidong * */ public class BigInteger { /** * @param args */ public static void main(String[] args) {

游海东的技术专栏 3074

【面试】BigInteger的部分实现【转】

[color=violet][size=xx-large]期中考试题2:BigInteger的部分实现[/size][/color] Java中long类型可以表示 -9,223,372,036,854,775,808(即-2^64)到9,223,372,036,854,775,807(即2^64-1)范围内的整数。有的时候我们希望能够处理在此范围之外的整数。 为此,我们设计了一个BigInt...

宋轶山 269

【Java 常用类】java.math包(1)BigInteger的常用方法(大整型)

文章目录前言一、BigInteger二、使用1.字段2.构造器2.1 字节数组转十进制2.2 字符串转数字2.3 n进制转十进制3.常用方法3.1 算数运算符(加减乘除 + 取余)3.2 比较两数大小3.3 十进制转n进制3.3 最大公约数3.4 继承的方法3.5 和Math类相同的方法3.6 素数3.7 最小的表示位数3.8 获取当前数的相反数 + 获取正负符号3.9 long转BigInte...

长生的梦呓 4493

简析Java中System,Integer,Math类

学过Java的人都会有一种感受,Java中含有丰富的类库,因此C语言需要几十行的代码来完成的程序,用Java要方便许多。在此只做其中三个的简析,感兴趣的可以查阅官方文档。 (链接:https://docs.oracle.com) System System类包含了几个有用的类字段和方法。它不能被实例化。 System类提供的设施包括标准输入、标准输出和错误输出流;访问外部定义的属性和环境变量;加...

qq_43797186的博客 298

java.math.BigInteger使用心得总结

今天参考课本写了一个关于二进制与十进制转换的程序,程序算法不难,但写完后测试发现不论是二转十还是十转二,对于大于21亿即超过整数范围的数不能很好的转换。都会变成0.参考书籍发现使用使用BigInteger可以解决这个问题。于是查找了下JDK,然后测试几次终于写成功了!使用心得如下:1,BigInteger属于java.math.BigInteger,因此在每次使用前都要import 这个类。偶开始

2902

Java调用 Java.math.BigInteger 实现大数四则运算

package bigDateOperate; import java.math.BigInteger; import java.util.Scanner; public class bigData { public static void main(String[] args) { Scanner s=new Scanner(System.in); String str1=null,...

HurryRabbit 1598

java.math.BigInteger

BigInteger定义         public class BigInteger extends Number implementsComparable         不可变的任意精度的整数。所有操作中,都以二进制补码形式表示BigInteger(如Java的基本整数类型)。BigInteger提供所有Java的基本整数操作符的对应物,并提供java.lang.Math的所有相关方法

知行流浪 5190

关于Java的Math,Integer,System类的学习

Math类 Math类也就是数学类,包含的是Java里面用来对数字运算的一些方法函数和使用技巧。 常量E:自然对数的基数 常量PI:圆周率、 三角函数方法:acos(反余弦),asin(反正弦),atan(反正切),atan2(极坐标角度的反正切),cos(余弦值),cosh(双曲余弦值),sin(正弦),sinh(双曲正弦),tan(正切),tanh(双曲正切) 指数函数方法: ...

qq_44756558的博客 255

Java中的System、Integer与Math类的学习笔记

目录System类Integer类Math类 System类 Java中的System类主要用于输入输出,与获取一些系统信息与进行一些系统操作,下面给出API中对system类的解释: 系统类提供的工具包括标准输入、标准输出和错误输出流;访问外部定义的属性和环境变量;加载文件和库的方法;以及快速复制数组一部分的实用方法 System类的构造方法为private,且所有办法都为static,所以...

weixin_43965303的博客 285
上一篇: 重载和覆盖的区别,通过反射获取泛型实际类型,枚举要点,五个最常用的集合类之间的区别和联系,final总结
下一篇: 内嵌,J2SE常用类,Comparator 和 Comparable
cdestiny
博客等级 码龄14年 12粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值