Java 中的数值运算-BigDecimal

详解BigDecimal及其加减乘除运算 目录 一、BigDecimal概述 二、构造函数详解 1、BigDecimal(int val) 2、BigDecimal(intval, MathContextmc) 3、BigDecimal(longval) 4、BigDecimal(longval, MathContextmc) 5、BigDecimal(BigIntegerval) 6、BigDecima... 阅读详情

遇到这么一个问题,

    public static void main(String[] args)
    {System.out.print("((0.7-0.4))==");
            System.out.print(((0.7-0.4))); 
    }

结果输出的是:

((0.7-0.4))==0.29999999999999993;

搜索了下,这里就需要使用  BigDecimal   类.

它有两个构造方法:

BigDecimal(double   val)    
                      Translates   a   double   into   a   BigDecimal.    
  BigDecimal(String   val)    
                      Translates   the   String   repre   sentation   of   a   BigDecimal   into   a   BigDecimal.  

如果想要精确计算,一定要使用第二种方法.

但每次都需要将浮点数转换成String,再将String转化成BigDecimal,调用其数学方法继续计算,再将结果转换成浮点数.

下面使用一个工具类来封装下加减乘除四种方法.

Arith.java:   
    
  import   java.math.BigDecimal;   
  /**   
    *   由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精   
    *   确的浮点数运算,包括加减乘除和四舍五入。   
    */   
    
  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的初始化也需要注意。为了避免精度损失,建议使用字符串形式来初始化BigDecimal对象。例如,使用new BigDecimal("0.005")而不是new BiqDecimal(0.005), 阅读详情

相关推荐

bigdecimal的加减乘除的一系列骚操作

两个bigdecimal的加法 //前提为a、b均不能为null BigDecimal a=new BigDecimal(2021); BigDecimal b=new BigDecimal(1995); a=a.add(b);//a=4016 b=1995 因为是a=a+b 两个bigdecimal的减法 //前提为a、b均不能为null BigDecimal a=new BigDecimal(2021); BigDecimal b=new BigDecimal(1995); a=a.subt

yuanting_的博客 619

BigDecimal计算(加减乘除)

BigDecimal加法,BigDecimal减法,BigDecimal乘法,BigDecimal除法,BigDecimal计算

nbzhaomao的博客 6万+

开源大模型“去审查化”技术解析:从LLaMA架构到本地部署与伦理边界

大型语言模型(LLM)基于Transformer架构,通过海量数据训练获得理解和生成自然语言的能力。其核心原理在于自注意力机制对上下文关系的建模。为了确保输出内容的安全与合规,主流模型普遍采用基于人类反馈的强化学习(RLHF)等技术进行安全对齐。这一过程旨在使模型行为符合人类价值观,是AI伦理工程实践的关键环节。然而,在特定研究场景下,如对抗性测试或内容安全算法研究,技术人员需要模拟极端对话以评估系统鲁棒性,这催生了针对“去对齐”或“移除护栏”的技术探索。此类技术通常通过对预训练模型进行反向微调或继续训练来

weixin_33743880的博客 589

BigDecimal加减乘除计算

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度。所以开发中,如果我们需要精确计算的结果,则必须使用BigDecimal类来操作。

qq_41482600的博客 8638

手把手讲解RTX5操作系统在GD32F407上的移植

然后将GD32F4xx_Demo_Suites_V2.6.4\GD32407V_START_Demo_Suites\Projects\01_GPIO_Running_LED下面的main函数复制到我们的项目文件夹中;打开对应GD32407V_START_Demo_Suites的文件夹下面的Utilities,复制gd32f407v_start.c和gd32f407v_start.h文件到一开始项目保存的文件夹下面;为了验证我们的操作系统是否被正确添加,是否能够正确运行,我们需要添加示例文件;

Praguejing的博客 1860

matplotlib三维画图之观察博弈论混合策略下纳什均衡点

参考链接: 博弈论入门20讲之第16讲-猜谜游戏-散户如何赢庄家 游戏背景: 我的期望是: 你的期望是: 使用Python的matplotlib画图: import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = Axes3D(fig) X = np.linspace(0, 1, 100) Y = np.linspace(0, 1,

敲代码的小风 1258

JAVA:货币金额类型、精确小数类型数值的定义BigDecimal和基本运算操作

1.精确小数类型需要用BigDecimal类型 在JAVA中有8种基本数据类型(boolean, byte, short, int, long, float, double, char),其中float和double都是浮点型,但平常我们需要表示货币金额或小数类型的数值时,不能用这两种类型,因为浮点型的精确范围是不适用于日常的精确小数计算。 我们需要使用的类型是java.math.BigDecimal类型。 2.创建对象 使用BigDecimal(String val)的构造方法创建对象 如Big

奋斗鱼 6515

通过 CoovaChilli 和 FreeRADIUS 搭建一个公共 Wi-Fi 的认证系统,实现用户连接到 Wi-Fi 后通过 Captive Portal(强制登录页面)进行认证

要实现固定设备连接的功能,你可以通过MAC 地址认证来限制哪些设备可以通过 FreeRADIUS 进行身份验证和连接。你可以在 FreeRADIUS 的users文件中直接配置允许的设备的 MAC 地址,也可以通过数据库存储和查询设备信息,进一步提高管理效率。通过这些方法,你可以灵活地控制哪些设备能够访问你的 Wi-Fi 网络。

m0_69943017的博客 2646

java数值运算divide_java语言基础之四:BigDecimal大数值,Optional类型,运算符

一:大数值:BigDecimal BigIntegerBigDecimal/BigInteger.valueOf(x)把对应的普通数值转为大数值比较compareTo()相等—0,大于—正数,小于—负数加–add 减–subtract *—multiply /----divide %----mod .abs()取绝对值二.Optional类型1.将一个可能为null 的对象包装成O...

weixin_29369017的博客 720

Unity 热更新技术 | (二) AssetBundle - 完整系列教程学习

开始学习热更新方面系列知识,就从这一篇开始吧! 本系列教程 会从热更新基本概念出发,详细介绍热更新相关的全套知识点。 如热更新技术基本原理、热更新主流方案、AssetBundle系列教程、Lua语言编程、Lua与Unity交互教程、Xlua框架使用、热更新实战教程等方面。 热更新作为一个开发者必备技能,如果想学习的话,可以从现在开始了哦~ 接下来从 AssetBundle - 完整系列教程学习 开始学习吧!

努力前行,总会成为自己心中的那道光 1万+

从一个 ASIN 看透亚马逊:商品模型背后的增长飞轮

在亚马逊电商体系中,每件商品背后都有一套严密的商品建模逻辑。本篇文章以“ASIN 的一生”为线索,系统拆解了亚马逊的商品模型:从飞轮战略出发,剖析 SDP(Single Detail Page)机制如何实现标准化展示;再到 ASIN 编码、父子变体结构与 Offer 分离模型,逐层解析商品信息如何被建构、聚合与呈现。通过图解与案例,文章帮助读者理解商品建品流程、同款聚合原则、价格控制机制等核心逻辑,避免常见运营误区,是一份面向运营、产品、技术人员的实用参考指南。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 13万+

java 数值运算

一、整数运算 整数类型 1、Java有四种整数类型:byte、short、int和long。 2、Java默认整数计算的结果是int类型。 3、整数的字面量是int类型。 4、若字面量超过int类型的最大值,则字面量是long类型,那么后面要用L(或l)表示该值是long类型。 整数运算 Java的整数运算遵循四则运算规则,可以使用任意嵌套的小括号。四则运算规则和初等数学一致。整数的数值表示不但是精确的,而且整数运算永远是精确的,即使是除法也是精确的,因为两个整数相除只能得到结果的整数部分。 溢出 要特别注

jiqiren1994的博客 2112

第一章:信号链的精度之战:深入解决电流采样偏差

摘要:本文深入探讨了FOC控制中电流采样偏差问题及其解决方案。电流采样偏差主要来源于偏移误差、增益误差、非线性误差和温漂四大类,其中偏移误差对FOC性能影响最为严重。硬件方面建议采用高精度采样电阻、低失调运放和独立基准电压等设计;软件层面提出了上电自动零点校准、在线实时补偿和模型闭环补偿三种策略。最后介绍了量产自动化校准系统,通过硬件优化和软件补偿相结合,确保每台产品电流采样精度的一致性,为FOC控制奠定坚实基础。

汽车软件开发 602

java中运算类型_Java中的Bigdecimal类型运算

版权声明:此文章转载自_infocool原文链接:http://www.infocool.net/kb/Java/201609/192199.html如需转载请联系听云College团队成员小尹 邮箱:yinhy#tingyun.com双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。Java在java.math包中提 供的API类BigDeci...

weixin_28786193的博客 194

国科大学习资料--模式识别与机器学习(黄庆明)--2020期末考试题

国科大学习资料–模式识别与机器学习(黄庆明)–2020期末考试题 国科大学习资料–模式识别与机器学习(黄庆明)–2020期末考试题 国科大学习资料–模式识别与机器学习(黄庆明)–2020期末考试题 ============================================================================================================================================================

无名何许人的博客 2601

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

BigDecimal运算函数

主类型    大小    最小值    最大值    封装器类型 boolean    -    -    -    Boolean Char    16-bit    Unicode 0    Unicode 216- 1    Character byte    8-bit    -128    +127    Byte Short    16-bit    -215    +215

把思想充满在语言之中 1441

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java中BigDecimal工具类(支持空值运算版)

前言 需要计算的场景绕不过去会使用BigDecimal类,可频繁的判空让代码可读性下降也使代码冗余度增高,不判空又容易报空指针异常,而且有些场景下的计算,结果为空时需要返回null,所以...

Java笔记虾 3143

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

BigDecimal:高精度数值运算类

BigDecimal是一个用于高精度数值运算的类,它比基本的double或float类型更精确,非常适合需要精确计算的场景,如金融计算、科学计算等,因为这些领域对数值精度要求非常高,不能容忍浮点运算带来的误差。为什么需要BigDecimal。double和float在表示某些小数时存在精度问题,因为它们是基于二进制的。例如,0.1在二进制中是一个循环小数,这会导致计算结果出现意外的误差。因此,BigDecimal应运而生,它以字符串的形式存储数值,确保精确的十进制表示。为什么使用BigDecimal。

weixin_73060959的博客 652

Java中的Bigdecimal类型运算

BigDecimal类 双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。表5.7中列出了BigDecimal类的主要构造器和方法。 表5.7 BigDecimal类的主要构造器和方法 构造器 描 述 BigDe...

零碎记忆软件区 202

BigDecimal在java中的基本使用

BigDecimal在java中的基本使用

李东阳的个人博客 1883

Java中BigDecimal的用法

如果对数值结果精度要求很高,那么就可以使用BigDecimal,BigDecimal可以精准的控制小数点后面的数字 1.  实例 BigDecimal 对象   通常会使用 String 和 int 构造方法实例出 BigDecimal 对象,即  new BigDecimal(String val); new BigDecimal(int val);   如参数为 double 类型...

我的博客 2972

java中的(大数值)BigInteger和BIgDecimal

大数值 基本语法: 如果基本的整数和浮点数精度不能满足需求,那么可以使用java.math包中的两个很有用的类:BigInteger和BigDecimal实现了任意长度数字序列的数值.BigInteger类实现了任意精度的整数运算.BigDecimal实现了任意精度的浮点数运算. 使用静态的valueOf方法可以将普通的数值转换为大数值: BigInteger a=BigInteger.value...

xiongchu的博客 565

BigDecimal详解

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。BigDecimal所创建的是对象,故我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。WRITE-BUG研发团队衷心希望【WRITE-BUG数字空间】可以给每位同学一个属于自己的秘密空间,同时祝愿大家在“公开圈子”世界里,遇见志同道合的伙伴们,因为我们与大家一样,都曾孤独前行着。

wm1634208243的博客 115

大数值运算类BigInteger&BigDecimal

一.大数值运算类 1.整数类型的大数值运算类 - BigInteger 代码实现: package com.dream.big; import java.math.BigInteger; public class Test01 { public static void main(String[] args) { BigInteger big1 = new BigInteger("123456789123456789123456789"); BigInteger big2 = new B

L04593的博客 198

【java】BigDecimal大数值与精确计算

一、大数值 java.math包中的两个类 整数运算 BigInteger 浮点数运算 BigDecimal (1)BigInteger 代码示例: import java.math.*; public class BigInteger { public static void main(String[] args) { BigInteger b1 = new BigInteg...

linbomm的博客 401
下一篇: Windows7 下载android源码
Harlan9001
博客等级 码龄14年 228粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值