java BigDecimal使用(小数点,字符串等转换)

这篇具有很好参考价值的文章主要介绍了java BigDecimal使用(小数点,字符串等转换)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、BigDecimal介绍 

Java中提供了操作大数字(超过16位有效位)的类,

java.math.BigInteger 类和 java.math.BigDecimal 类,用于高精度计算。

float和Double只能用来做科学计算、工程计算等;在商业计算中,对数字精度要求较高(例如货币值),必须使用 BigInteger 类和 BigDecimal 类,它支持任何精度的定点数,可以用它来精确计算。

BigInteger BigDecimal
大整数 大小数

以BigDecimal为例。

BigDecimal类创建的是对象,不能使用传统的 +、-、*、/ 等算术运算符进行数学运算,而必须调用它的方法。方法的参数也必须是BigDecimal类型的对象。

二、数字转换类型问题

java中,BigDecimal十分好用。各种格式的数字只要往BigDecimal里无脑丢即可。例如:

        //字符串型
        String num1 = "10.0";
        BigDecimal d1 = new BigDecimal(num1);
        int i1 = d1.intValue();

例如,别的系统给你传数据,发过来的都是字符串,其中有个字段是数量。但对方传过来的是"10.0",如果用 Integer.parseInt(num1),就会报错如下。

java.lang.NumberFormatException: For input string: "10.0"

如果要处理这种情况,按照传统的方法,就得加很多校验,判断是否有小数点,等等。但如果用BigDecimal,就很舒服。

三、BigDecimal常见问题

1.new Decimal时不允许传double

new BigDecimal()的时候,不允许传入double类型的数,通常传入String类型的数(推荐这样)。

因为double类型的数传入BigDecimal无法得到精确值。

例如:

        BigDecimal b1 = new BigDecimal(0.1);    //不允许
        BigDecimal b2 = new BigDecimal("0.1");  //推荐

不允许传入double类型的原因: 

        BigDecimal b10 = new BigDecimal(0.1);
        BigDecimal b11 = new BigDecimal(1.1);
        System.out.println(b10.add(b11).doubleValue());    //输出1.2000000000000002

        BigDecimal b12 = new BigDecimal("0.1");
        BigDecimal b13 = new BigDecimal("1.1");
        System.out.println(b12.add(b13).doubleValue());    //输出1.2

如果值是double类型, 就需要先转换成String,再传入。也可以使用 valueOf(),用法如下

BigDecimal.valueOf(0.1)

它的源码其实就是将double转string:

    public static BigDecimal valueOf(double val) {
        return new BigDecimal(Double.toString(val));
    }

四、工具类

public class Arith {

    public static double add(double value1,double value2){
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        return b1.add(b2).doubleValue();
    }
    

    public static double sub(double value1,double value2){
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        return b1.subtract(b2).doubleValue();
    }
    

    public static double mul(double value1,double value2){
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        return b1.multiply(b2).doubleValue();
    }
    

    public static double div(double value1,double value2,int scale) throws IllegalAccessException{
        if(scale<0){         
            throw new IllegalAccessException("精确度不能小于0");
        }
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        return b1.divide(b2, scale).doubleValue();    
    }
}

五、保留小数位 

ROUND_DOWN --> 直接删除多余的小数位 ,(这种方式得到的绝对值不会比原数大)

ROUND_UP --> 在最后一位直接加1,

ROUND_CEILING --> 正数时与ROUND_UP一致,负数时与ROUND_DOWN一致

ROUND_FLOOR --> 正数时与Round_DOWN一致,负数时与ROUND_UP一致

ROUND_HALF_UP --> 四舍五入

ROUND_HALF_DOWN --> 五舍六入

ROUND_HALE_EVEN --> 四舍六入五看奇进偶不进(四舍六入五成双)

参考

Java中BigDecimal类型数据保留小数的精度设置

java精确除法运算(BigDecimal)

其他参考

BigDecimal的用法详解(保留两位小数,四舍五入,数字格式化,科学计数法转数字,数字里的逗号处理)_bigdecimal 两位小数_liucw_cn的博客-CSDN博客

如何理解double精度丢失问题? - 知乎  

=======================分割线========================== 

文章到这里已经结束,以下是紫薯布丁

        //字符串型
        String num1 = "10.0";
        BigDecimal d1 = new BigDecimal(num1);
        int i1 = d1.intValue();

        BigDecimal b10 = new BigDecimal(0.1);
        BigDecimal b11 = new BigDecimal(1.1);
        System.out.println(b10.add(b11).doubleValue());    //输出1.2000000000000002

        BigDecimal b12 = new BigDecimal("0.1");
        BigDecimal b13 = new BigDecimal("1.1");
        System.out.println(b12.add(b13).doubleValue());    //输出1.2

    public static BigDecimal valueOf(double val) {
        return new BigDecimal(Double.toString(val));
    }

public class Arith {

    public static double add(double value1,double value2){
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        return b1.add(b2).doubleValue();
    }
    

    public static double sub(double value1,double value2){
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        return b1.subtract(b2).doubleValue();
    }
    

    public static double mul(double value1,double value2){
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        return b1.multiply(b2).doubleValue();
    }
    

    public static double div(double value1,double value2,int scale) throws IllegalAccessException{
        if(scale<0){         
            throw new IllegalAccessException("精确度不能小于0");
        }
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        return b1.divide(b2, scale).doubleValue();    
    }
}文章来源地址https://www.toymoban.com/news/detail-629693.html

到了这里,关于java BigDecimal使用(小数点,字符串等转换)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python 保留小数点位数

    format函数:使用 format() 方法将数值格式化为一个字符串,并指定要保留的小数位数 ’%.xf’方法:使用字符串格式化操作符 % 将数值格式化为一个字符串,并指定要保留的小数位数 内置函数 round(),该函数可以保留小数点后面的数,并对小数进行四舍五入 使用“round(数,位数

    2024年02月06日
    浏览(57)
  • uniapp中APP端使用echarts用formatter设置y轴保留2位小数点不生效

    uniapp使用echarts,在内置浏览器中,设置保留2位小数能正常显示(代码如下),但是在APP端这个设置不起作用。 app端不生效是因为: 在app端,回调函数无法从renderjs外传递,上面的设置使用了回调函数formatter,所以app端不生效。 解决方法 在引用echarts中,有一个初始化的文件

    2024年02月08日
    浏览(48)
  • Matlab保留小数点后两位

    Matlab保留小数点后两位 在Matlab中,我们经常需要处理数值数据,并在输出结果时保留特定的小数位数。本文将演示如何使用Matlab来保留小数点后两位。 首先,让我们看一个简单的例子。假设我们有一个数值变量x,其值为3.14159265359。我们希望将其保留两位小数并输出。 在上

    2024年02月05日
    浏览(45)
  • QString设置小数点精度位数

    QString 转double,double转QString 中的小数点问题 原文链接:https://blog.csdn.net/xxzhaoming/article/details/130364751 在Qt中,我们可以使用QString::number()函数将float类型转换为QString类型以便在界面上显示。该函数默认显示6位小数,但我们也可以通过设置第二个参数来控制小数点位数。 以下是

    2024年02月04日
    浏览(42)
  • python中如何改变小数点后位数

    在python中一般一般有三种改变小数点后位数的方法: 第一种:使用python内置的round()函数 a = 1.1314 a = 1.0000 a = 1.1267 b = round(a.2)b = round(a.2)b = round(a.2) output b = 1.13 output b = 1.0 output b = 1.13 第二种:使用python内置的format()函数 a = 1.1314 a = 1.0000 a = 1.1267 output b=1.13 outpu

    2023年04月08日
    浏览(37)
  • python保留小数点后几位的方法

    方法一:使用字符串格式化 注意:使用字符串格式化后的是字符串格式 输出 方法二:使用round内置函数 注意:使用round后的是浮点数格式 输出 输出

    2024年02月05日
    浏览(43)
  • 在 JavaScript 中,保留小数点后两位的方法

    在 JavaScript 中,有多种方法可以保留小数点后两位。以下是其中的一些方法: 1. toFixed() 方法:该方法将数字转换为字符串,并保留指定的小数位数。 2. Math.round() 方法:该方法将数字四舍五入到指定的小数位数。  3. parseFloat() 和正则表达式:该方法将字符串转换为数字,并

    2024年02月12日
    浏览(37)
  • laravel 图表Apexchart 整数多出小数点

    Apexchart做统计界面发现一个问题,数据全是整数,但是还显示小数点,如下图:  网上很少有答案,自己研究了很久,分享下经验 第一种方案重新buildDefaultScript方法    第2种方案: 在图表配置加入可执行的 JS 代码 可以自己封装一个方法继承Chat 然后在调用 改写后效果如下

    2024年02月06日
    浏览(33)
  • chatgpt赋能python:Python去掉小数点的方法

    在Python编程中,经常会遇到需要去掉小数点的情况,比如输出整数等。本文将介绍常用的几种方法。 将浮点数转换为整数是最简单的方法之一,使用内置函数int()即可。 但需要注意的是,使用这种方法会直接截断小数部分,可能会导致精度损失。 使用内置函数round()可以对浮

    2024年02月11日
    浏览(40)
  • 【iOS】UITextField中的输入检测——限制只能输入数字和小数点

    最近趁着放假时间,在看The Big Nerd Ranch的iOS编程,想着重新复习一遍iOS开发的基础知识 书中第四章有一个温度转换的app实现,整体实现并不难 其中有个问题—— 如何利用 UITextFieldDelegate 委托限制 UITextField 的输入 UITextFieldDelegate 里面有个函数 简单来说,就是通过这个函数处

    2024年01月20日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包