BigDecimal 精度问题

2023-11-09

BigDecimal 精度问题

在使用BigDecimal过程中,暂时遇到两个问题,都是精度问题,一个是精度丢失,一个是精度显示问题。

精度丢失

BigDecimal创建对象有很多种方式:
在这里插入图片描述
通过double类型去声明bigdecimal对象时,就发生精度不准的问题在这里插入图片描述
这个就不建议使用了,可以换种方式去解决这个问题,用string构造器构建对象:
在这里插入图片描述
设置好对象的精度大小也可以解决这个问题:
在这里插入图片描述

精度过长显示科学计数法

在这里插入图片描述
在这里插入图片描述
这种显示科学计数法的问题,主要产生原因有两个:
1、小数点位数大于6;
2、只有最后一个小数非0,其他位都位0;
这种情况不会影响计算,只会影响显示,打印日志等要用到toString方法的情况。
罪魁祸首是 Bigdecimal的ToString方法:

 @Override
    public String toString() {
        String sc = stringCache;
        if (sc == null)
            stringCache = sc = layoutChars(true);
        return sc;
    }

在这里插入图片描述
只要声明BigDecimal之后就有了stringCache这个属性,debug从头跟到尾没有看到stringCache在哪里设置过。toString方法中恰恰使用了这个属性,所以导致toString显示的是科学计数法。

解决方案:
toPlainString方法就会显示完整的数值。

public String toPlainString() {
        if(scale==0) {
            if(intCompact!=INFLATED) {
                return Long.toString(intCompact);
            } else {
                return intVal.toString();
            }
        }
        if(this.scale<0) { // No decimal point
            if(signum()==0) {
                return "0";
            }
            int tailingZeros = checkScaleNonZero((-(long)scale));
            StringBuilder buf;
            if(intCompact!=INFLATED) {
                buf = new StringBuilder(20+tailingZeros);
                buf.append(intCompact);
            } else {
                String str = intVal.toString();
                buf = new StringBuilder(str.length()+tailingZeros);
                buf.append(str);
            }
            for (int i = 0; i < tailingZeros; i++)
                buf.append('0');
            return buf.toString();
        }
        String str ;
        if(intCompact!=INFLATED) {
            str = Long.toString(Math.abs(intCompact));
        } else {
            str = intVal.abs().toString();
        }
        return getValueString(signum(), str, scale);
    }

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BigDecimal 精度问题 的相关文章

  • BigDecimal类型 比较大小的方法

    1 转成int BigDecimal b1 61 new BigDecimal 34 121454125453 145 34 if b1 intValue lt 0 System out println 34 金额为负数 xff01 34
  • BigDecimal计算工具类

    方便以后大家使用 span class token keyword import span span class token namespace java span class token punctuation span math spa
  • Java BigDecimal开方

    前言 一般开平方使用的是Math中的静态方法Math sqrt double a xff0c 涉及到金融计算的时候 xff0c Math sqrt double a 精度就不够了 金融领域的计算 xff0c 用的都是BigDecimal类型
  • BigDecimal 如何在一个区间的比较

    BigDecimal 如何在一个区间的比较 背景 由于BigDecimal 的精度比较高 在计算的时候有时候存入数据库的时候会进行四舍五入 会对后面的结果判断存在误差 所以比较的结果会在一个区间的 public static boolean
  • BigDecimal转String

    BigDecimal是处理高精度的浮点数运算的常用的一个类 code public static void main String args 浮点数的打印 System out println new BigDecimal 10000000
  • Java BigDecimal总结

    文章目录 Java BigDecimal总结 概述 float 和 double的问题 创建BigDecimal对象 BigDecimal valueOf 源码分析 equals 和 compareTo BigDecimal设置精度和舍入模
  • BigDecimal类型比较数字大小

    BigDecimal类型比较数字大小 1 转成int BigDecimal b1 new BigDecimal 121454125453 145 if b1 intValue lt 0 System out println 金额为负数 Sy
  • JavaScript 有十进制数学库吗?

    是否有一个成熟的库可以在 JavaScript 中进行基于十进制的数学 可能是任意精度的 Edit 我希望将此信息作为有关浮点相关问题的参考页 以及在二进制浮点不合适时使用的替代方案 http floating point gui de 作
  • Java BigDecimal 三角方法

    我正在开发一个数学解析器 它能够像这样评估字符串 5 b sqrt c 2 我正在使用 ANTLR 进行解析并取得了良好的进展 现在我迷上了Java课程BigDecimal并想 嘿 为什么不考虑这里的精度呢 我的问题是 Java API 没
  • 如何将字符串解析为 BigDecimal? [复制]

    这个问题在这里已经有答案了 我有这个字符串 10 692 467 440 017 120 这是一个金额 我想将其解析为 BigDecimal 问题是我尝试了 DecimalFormat 和 NumbeFormat 都没有成功 Try thi
  • Java大十进制数格式异常

    为什么下面的代码会抛出 java 数字格式异常 BigDecimal d new BigDecimal 10934 375 是的BigDecimal课程不占用任何Locale在其构造函数中考虑到String 可以在该构造函数的 Javado
  • 如何获得唯一确定给定双精度的“最短”BigDecimal

    基本上 我很好奇如何掌握new BigDecimal Double toString d 无需经历创建字符串的过程 The 的文档Double toString http download oracle com javase 6 docs
  • 从 Java 1.4 迁移到 Java 1.5+ 时避免 BigDecimal 的问题

    我最近将 Java 1 4 应用程序迁移到 Java 6 环境 不幸的是 我遇到了一个问题BigDecimal存储在Oracle数据库中 总而言之 当我尝试存储 7 65E 7 大十进制值 76 500 000 00 在数据库中 Oracl
  • 获取除法后数字中所有小数位

    我目前正在使用 BigDecimal 它给了我更多的小数 但对于我想要做的事情来说还不够 我需要能够一直到 10 6 位数字 这是我当前的代码 BigDecimal num new BigDecimal 103993 33102 0 pw
  • 1.8 与 1.9 中的 BigDecimal

    升级到 ruby 1 9 时 在比较预期值与实际值时 我的测试失败了BigDecimal这是 Float 除法的结果 expected 0 495E0 9 18 got 0 4950000000 0000005E0 18 27 谷歌搜索 b
  • Java BigDecimal精度问题

    我知道以下行为是一个老问题 但我仍然不明白 System out println 0 1 0 1 0 1 或者即使我使用BigDecimal System out println new BigDecimal 0 1 doubleValue
  • 对于大输入,十进制扩展程序运行速度非常慢

    我正在编写一个程序来计算数字的小数扩展103993 33102我想根据用户输入的数字打印出所有尾随小数 它可以快速运行所有数量最多10 5但如果输入10 6编程大约需要 5 分钟才能打印出答案 我怎样才能加快速度 我尝试了两种不同的方法 一
  • 添加 2 个 BigDecimal 值 [重复]

    这个问题在这里已经有答案了 class Point BigDecimal x BigDecimal y Point double px double py x new BigDecimal px y new BigDecimal py vo
  • 在 Ruby 中覆盖 BigDecimal to_s 默认值

    当我从数据库表中检索数据时 会填充一个数组 某些字段被定义为小数和货币字段 并且在数组中它们表示为 BigDecimal 我使用这些数组值来填充 CSV 文件 但问题是所有 BigDecimal 值默认都以科学格式表示 这是 BigDeci
  • BigDecimal 的 java 数学库允许空值

    是否有一个 BigDecimal 库具有 BigDecimal 的基本操作 并且允许空值 出于数学目的 Null 应被视为 0 我不想对可能的空值进行所有空检查 您要么永远不允许数据库 应用程序中存在空值 要么使用以下命令查看和初始化所有内

随机推荐

  • 输出时保留有效数字

    保留3位有效数字 1 C include
  • SQL优化

    1 确认是否建立索引 是否索引失效 原则 没有索引考虑加索引 有索引先看索引建立的是否合理以及尽量避免索引失效 1 1 如果不是业务需要查询所有字段 避免直接select 原因 完全没有走覆盖索引的可能 有可能索引失效 增加了数据传输的开销
  • 求集合的所有子集的算法(C++)

    求集合的所有子集的算法 对于任意集合A 元素个数为n 空集n 0 其所有子集的个数为2 n个 如集合A a b c 其子集个数为8 对于任意一个元素 在每个子集中 要么存在 要么不存在 对应关系是 a gt 1或a gt 0 b gt 1或
  • linux网络摄像头服务器,网络摄像头Logitech和Linux

    我有罗技c310相机 宣称的特点是720p30fps 如果您将相机连接到Windows 则记录与所述720p 30fps完全一致 图片清晰 挑战是将同一个摄像头连接到Orangepi 服务器Armbian 并在其上保存视频文件 相机显示为
  • 区块链:一场始料未及的革命

    当主流媒体还在忙于猜测加密货币价格及其黑市阴谋时 他们已经遗漏了这一切的本质事实 那就是 密码学家们悄然发明了一套全新的技术原型 Unitimes特约作者Haseeb Qureshi在其文章 区块链 一场始料未及的革命 Blockchain
  • Qt-OpenCV学习笔记--图像的腐蚀--erode()

    概述 通过一个特定的结构元素 腐蚀 一个图像 图像腐蚀的过程类似于一个卷积的过程 源图像矩阵A以及结构元素B B在A矩阵上依次移动 每个位置上B所覆盖元素的最小值替换B的中心位置值 即锚点处 完成整个腐蚀的过程 算法通俗理解 其运算过程就是
  • 如何科学进行用户分析?六大方法论了解一下!

    用户研究是用户中心的设计流程中的第一步 它是一种理解用户 将他们的目标 需求与商业宗旨相匹配的理想方法 能够帮助企业定义产品的目标用户群 在用户研究过程中 数据的使用及挖掘是非常重要的 那么 有哪些通用的用户分析方法 如何分析你的用户 本篇
  • verilog 产生16进制递增bin文件

    https verificationacademy com forums systemverilog how do i write binary dump file array my testbench w 写 r 读 a 追加 b 二进制
  • 手把手教你搞定 微信支付 跳出微信支付的坑 (公众号支付,核心代码可以用于小程序支付)

    1 准备工作 设置支付目录 请确保实际支付时的请求目录与后台配置的目录一致 否则将无法成功唤起微信支付 在微信商户平台 pay weixin qq com 设置您的公众号支付支付目录 设置路径 商户平台 gt 产品中心 gt 开发配置 如下
  • 2013年11月22日星期五(T3DLIB1剩余---1)

    现在进行T3DLIB的残余 define SCREEN DARKNESS 0 define SCREEN WHITENESS 1 define SCREEN SWIPE X 2 define SCREEN SWIPE Y 3 define
  • 【计算机网络】物理层:物理层要解决哪些问题?

    物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流 而不是具体的传输媒体 现有的计算机网络中的硬件设备和传输媒体的种类非常繁多 而通信手段也有许多不同方式 物理层的作用是尽可能屏蔽这些差异 使物理层上面的数据链路层感觉不到这些
  • iptables需求:开启防火墙:可以正常使用ssh服务,dns服务, httpd服务,chrony服务, nfs服务安装

    1 iptables需求 开启防火墙 可以正常使用ssh服务 dns服务 httpd服务 chrony服务 nfs服务 安装 yum install y iptables services 关闭firewalld 开启iptables sy
  • git的代码撤销步骤

    工作区的代码撤销 1 git status 查看哪些文件是修改过的 2 git checkout 文件路径 让这个文件回到最近一次git commit或git add时的状态 git add到暂存区的代码要撤销 1 git reset HE
  • 时序预测

    时序预测 MATLAB实现基于GRU门控循环单元的时间序列预测 递归预测未来 多指标评价 目录 时序预测 MATLAB实现基于GRU门控循环单元的时间序列预测 递归预测未来 多指标评价 预测结果 基本介绍 模型结构 程序设计 参考资料 预测
  • MySQL数据库、表常用命令

    目录 一 数据库分类 1 关系型数据库 2 非关系型数据库 二 MySQL相关基础 三 MySQL数据库基础操作 1 显示数据库 2 创建数据库 3 删除数据库 4 使用数据库 四 常用数据类型 1 数值类型 2 字符串类型 3 日期类型
  • 【C51】单片机芯片之——图解74HC595

    第一部部分用于快速查阅使用 详细的使用见文章第二部分 引脚图 14脚 DS SER 串行数据输入引脚 13脚 OE 输出使能控制脚 它是低电才使能输出 所以接GND 12脚 RCK 存储寄存器时钟输入引脚 上升沿时 数据从移位寄存器转存带存
  • Maven依赖冲突

    An attempt was made to call a method that does not exist 依赖冲突完整报错如下 Description An attempt was made to call a method tha
  • 字符串04--左旋转字符串

    字符串04 左旋转字符串 jz43 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 汇编语言中有一种移位指令叫做循环左移 ROL 现在有个简单的任务 就是用字符串模拟这个指令的运算结果 对于一个给定的字符序列S 请你把其循环左
  • express和koa中的超时处理

    从某个话题中得到的灵感 这里做一个分享 http cnodejs org topic 592fdc2f03dba3510d8a62a0 59364c3b538dbcaa6bc7dd48 楼主遇到一个问题 如何管理express中的超时 ex
  • BigDecimal 精度问题

    BigDecimal 精度问题 在使用BigDecimal过程中 暂时遇到两个问题 都是精度问题 一个是精度丢失 一个是精度显示问题 精度丢失 BigDecimal创建对象有很多种方式 通过double类型去声明bigdecimal对象时