码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • BigInteger和BigDecimal的使用


    引文

    系统中,在涉及到金额的运算中,往往都会涉及到小数点,而浮点数在计算机中会存在精度丢失的问题,但是像涉及到金额的业务对计算结果的精度要求较高,你们是怎么处理的?
    通常来说有两种解决方式:

    • 以分为单位,用Long来存储变量
    • 以BigInteger或BigDecimal来处理

    BigInteger和BigDecimal

    按照我的认知来说:
    在Java中,数值无非就是两种整数和浮点数,常用的基本数据类型就是int,float,但是这两个基本数据类型的范围太小了,于是还有long、double。
    后来为了迎合Java面向对象的思想,又有了包装类Integer、Float、Long、Double,但是这些包装类就是对基本数据类型的封装,表示数据的范围和精度并不会变化。
    因此又来了新的两个类BigInteger和BigDecimal:

    • BigInteger可以用来表示任意长度的整数
    • BigDecimal可以用来表示任意长度的浮点数
      BigInteger和BigDecimal的出现,这两个的底层原理就是使用数组来保存每一位数值,使得我们再也不用担心数据过长的问题。(hhh还记得高精算法吗?就是这个)
      这两个类的用法基本一致
      下面来说一下这两个的用法

    创建:

    1. 直接new BigXxx()
    2. BigXxx.valueOf()

    基本使用:

    • 加add()
    • 减substract()
    • 乘multiply()
    • 除divide()
    • 比较compareTo()、max()、min()
    • 求余remainder()
    • 商和余数一起返回divideAndRemainder()
      还有转换为基本数据类型:intValue()、doubleValue()…,可能会丢失精度的问题,因为BigInteger和BigDecimal能表示的范围远远大于long和double

    建议

    1. 尽量使用字符串来创建BigXxx实例。
      在创建BigXxx实例时,尽量使用形参是String的方法,因为用String表示数值能表示的更大,而且用字符串表示数值不会存在精度丢失的问题。
      而使用int或double的参数,能表示的数值范围受限,同时会存在精度丢失的问题,因为浮点数在计算机中不能精确表示。

    2. 在比较时,不要使用equals()方法,要使用compareTo()、max()、min()

    3. 在两个BigXxx在进行除运算时,一定要指定小数点保留位数。
      两者相除的结果是无限循环小数,那么一定要指定保留的小数点位数,否则报错。
      例如2÷3 = 0.66666无限循环小数

  • 相关阅读:
    《打造高可用PostgreSQL:策略与工具》
    回溯法就是学不会2 —— 括号生成问题
    PyQt5快速开发与实战 9.5 PyQtGraph在PyQt中的应用 && 9.6 Plotly在PyQt中的应用
    Slope compensation
    高通导航器软件开发包使用指南(6)
    谷歌AI机器人Bard发布强大更新,支持插件功能并增强事实核查;全面整理高质量的人工智能、机器学习、大数据等技术资料
    javaWeb网上购物系统的设计与实现
    力扣 53. 最大子数组和(C语言+分治递归、动态规划)
    MySQL常见面试题(三)
    消失的数字C/C++
  • 原文地址:https://blog.csdn.net/weixin_55697693/article/details/133553252
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号