当Double遇见Integer撞上大大的BigDecimal擦出优美的误差

2024-01-10 01:44

本文主要是介绍当Double遇见Integer撞上大大的BigDecimal擦出优美的误差,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

当Double遇见Integer撞上大大的BigDecimal擦出优美的误差


在解决误差前先问一个问题
数据库中字段为decimal类型,VO中能将字段设置为decimal类型吗?
答案是不能,VO层数据类型是Double类型。
所以是躲不过分数和整数的运算,而分数和整数运算就会有一定的误差,这对一些银行金融项目影响是巨大的,也是不可以的。

那肯定就会说上BigDecimal,但是上了BigDecimal就可以高枕无忧了吗?
NO,我之前也以为是这样,但问题才刚刚开始。
废话少说上代码:

public static void main(String[] args) {Integer i = 100;Double d = 598.81;Double c = d * i;System.out.println(c);
}

输出:

59880.99999999999


那我转换为BigDecimal
public static void main(String[] args) {Integer i = 100;Double d = 598.81;Double c = d * i;BigDecimal multiply = new BigDecimal(d).multiply(new BigDecimal(i));System.out.println(multiply);System.out.println(c);
}

输出:

59880.99999999999454303178936243057250976562500
59880.99999999999

咦~~~,怎么小数点不降反增了,找到BigDecimal文档中查看,原来直接将浮点类型转换为BigDecimal类型会有误差,官方是建议将浮点类型先转为String类型,再转为BigDecimal类型再进行运算才不会出现误差。

那我再转,将Double转为String类型再试试

public static void main(String[] args) {Integer i = 100;Double d = 598.81;Double c = d * i;BigDecimal multiply1 = new BigDecimal(d).multiply(new BigDecimal(i));String a = d.toString();BigDecimal multiply1 = new BigDecimal(a).multiply(new BigDecimal(i));System.out.println(a);System.out.println(c);System.out.println(multiply);System.out.println(multiply1);
}

输出:

598.81
59880.99999999999
59880.99999999999454303178936243057250976562500
59881.00

这下终于解决了。

我是时生,一个正在努力的小白。欢迎批评,欢迎指正,欢迎共享。
如果这篇文章对你有帮助,麻烦点个赞呗!

这篇关于当Double遇见Integer撞上大大的BigDecimal擦出优美的误差的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/589134

相关文章

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

单位权中误差 详细介绍

单位权中误差(Unit Weight Error, UWE)是用于描述测量数据不确定性的一个统计量,特别是在地理信息系统(GIS)、导航和定位系统中。它主要用于评估和比较不同测量系统或算法的精度。以下是对单位权中误差的详细介绍: 1. 基本概念 单位权中误差(UWE): 定义:单位权中误差表示每个观测值(测量值)在估算中的标准误差。它是误差的一个统计量,主要用于评估测量系统的精度。单位:通常

Java - BigDecimal 计算分位(百分位)

日常开发中,如果使用数据库来直接查询一组数据的分位数,就比较简单,直接使用对应的函数就可以了,例如:         PERCENT_RANK() OVER(PARTITION BY 分组列名 ORDER BY 目标列名) AS 目标列名_分位数         如果是需要在代码逻辑部分进行分位数的计算,就需要我们自己写一个工具类来支持计算了 import static ja

用Python实现时间序列模型实战——Day 14: 向量自回归模型 (VAR) 与向量误差修正模型 (VECM)

一、学习内容 1. 向量自回归模型 (VAR) 的基本概念与应用 向量自回归模型 (VAR) 是多元时间序列分析中的一种模型,用于捕捉多个变量之间的相互依赖关系。与单变量自回归模型不同,VAR 模型将多个时间序列作为向量输入,同时对这些变量进行回归分析。 VAR 模型的一般形式为: 其中: ​ 是时间  的变量向量。 是常数向量。​ 是每个时间滞后的回归系数矩阵。​ 是误差项向量,假

【深度学习 误差计算】10分钟了解下均方差和交叉熵损失函数

常见的误差计算函数有均方差、交叉熵、KL 散度、Hinge Loss 函数等,其中均方差函数和交叉熵函数在深度学习中比较常见,均方差主要用于回归问题,交叉熵主要用于分类问题。下面我们来深刻理解下这两个概念。 1、均方差MSE。 预测值与真实值之差的平方和,再除以样本量。 均方差广泛应用在回归问题中,在分类问题中也可以应用均方差误差。 2、交叉熵 再介绍交叉熵损失函数之前,我们首先来介绍信息

Error: label vector and instance matrix must be double的解决方法

在使用uci下载的数据时,建模时出现这个错误的解决方法 首先现在UCI上面下载数据 然后右键另存为就行了。这样我们就从UCI里面下载到了训练数据 在matlab 点 导入数据,数据类型要记得选第二个, 如果选择最后一个table就会出现这个问题 最后附上代码 %%之前先import wine.date IMPORTED DATA 设为Numeric Matrix (数值矩

Kafka 已落伍,转角遇见 Pulsar!

自 LinkedIn 2011 年创建了 Apache Kafka 后,这款消息系统一度成为大规模消息系统的唯一选择。为什么呢?因为这些消息系统每天需要传递数百万条消息,消息规模确实很庞大(2018 年 Twitter 推文平均每天 500 万条,用户数平均每天为 1 亿)。那时,我们没有 MOM 系统来处理基于大量订阅的流数据能力。所以,很多大牌公司,像 LinkedIn、Yahoo、Twit

如何简便的将List<Integer>转换成int[]?

使用Java 8的流(Streams)  ArrayList<Integer> list = new ArrayList<>();int[] intArray = list.stream().mapToInt(Integer::intValue).toArray();  若是maven项目可使用Apache Commons Lang库 <dependency> <groupId>

[LeetCode] 7. Reverse Integer

题:https://leetcode.com/problems/reverse-integer/description/ 题目 Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123Output: 321Example 2:Input: -123Output: -321Ex

删除文件夹遇见错误0x80070091目录不是空的

用java代码转移文件夹的时候发生了一点错误,导致递归生成了很多文件夹,删除文件夹的时候遇见错误0x80070091目录不是空的 有点恐慌,不会被我搞坏了吧。 一开始以为是权限问题,用命令"rd /s /q xxx"强删也不行。重启电脑再删除还是报这个错误。 搜了一下,看见有说往最后一个文件夹放一个txt文件,再删除就可以了。 用java程序放了一个(代码星火写的) import jav