同事因在涉及金钱交易中使用double造成无法挽回的损失,已跑路

嵌入式Linux网络调试:YT8531/YT8521 PHY驱动移植与设备树配置避坑指南 本文深入解析嵌入式Linux系统中YT8531/YT8521 PHY驱动移植与设备树配置的关键技术,涵盖内核驱动适配、RGMII接口时序调整及常见问题排查。针对Motorcomm千兆以太网PHY芯片,提供详细的设备树配置示例和调试技巧,帮助开发者规避典型设计陷阱,确保网络功能稳定运行。 阅读详情

作者:Java实用技术

来源:blog.youkuaiyun.com/vbirdbest/article/details/80280627

在《Effective Java》这本书(48条)中也提到这个原则:float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。所以,也才有了这个标题,不是标题党,是之前听一个同事说,他的一个朋友因为用了double来用作金钱运算,导致被黑客利用,造成不少的损失跑路了,下面咱们就来聊聊这个问题吧。

简介

Java中的简单浮点数类型float和double不能够进行运算,或者运算会丢失精度,不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。

// 浮点型计算不准确示例
@Test
public void testDouble(){
 // 0.060000000000000005
 System.out.println(0.05+0.01);
 // 0.5800000000000001
 System.out.println(1.0-0.42);
 // 401.49999999999994
 System.out.println(4.015*100);
 // 1.2329999999999999
 System.out.println(123.3/100);
 // 4.01 四舍五入保留两位
 System.out.println(Math.round(4.015*100)/100.0);
}

BigDecimal

BigDecimal有多种构造函数,常用的有2种,其中有一种不建议使用,就是double构造方式,建议使用String构造方式。

// 强制使用String的构造函数,double也有可能计算不太准确
// 原则是使用BigDecimal并且一定要用String来够造。
public BigDecimal(String val);
public BigDecimal(double val);

BigDecimal也定义了几个常用的值,0、1、10,静态的,可以通过类名直接引用BigDecimal.ZERO
publicstaticfinal BigDecimal ZERO = zeroThroughTen[0];
 /**
 * The value 1, with a scale of 0.
 *
 * @since 1.5
 */
 publicstaticfinal BigDecimal ONE = zeroThroughTen[1];
 /**
 * The value 10, with a scale of 0.
 *
 * @since 1.5
 */
 publicstaticfinal BigDecimal TEN = zeroThroughTen[10];

工具类

由于构造方法要用String对应的构造方法,如果我们要做一个加法运算,需要先将两个浮点数转为String,然后够造成BigDecimal,在其中一个上调用add方法,传入另一个作为参数,然后把运算的结果(BigDecimal)再转换为浮点数。你能够忍受这么烦琐的过程吗?下面我们提供一个工具类来简化操作。

import java.math.BigDecimal;
/**
 * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精
 * 确的浮点数运算,包括加减乘除和四舍五入。
 */
publicclass ArithUtil {
 //默认除法运算精度
 privatestaticfinalint DEF_DIV_SCALE = 10;
 /**
 * 提供精确的加法运算。
 * @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){
 thrownew 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){
 thrownew 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();
 }
}

测试

@Test
public void testBigDecimal(){
 BigDecimal price = BigDecimal.ZERO;
 // 通常建议优先使用(String)构造函数
 BigDecimal amount = new BigDecimal("6.66");
 // 0.06
 System.out.println(ArithUtil.add(0.05, 0.01));
 // 0.58
 System.out.println(ArithUtil.sub(1.0, 0.42));
 // 401.5
 System.out.println(ArithUtil.mul(4.015, 100));
 // 1.233
 System.out.println(ArithUtil.div(123.3, 100));
 // 4.02
 System.out.println(ArithUtil.round(4.015, 2));
 // BigDecimal 比较大小使用compareTo方法
 // public int compareTo(BigDecimal val);
}
(完)
推荐阅读:

答应我,别再写上千行的类了好吗
SpringBoot实现过滤器、拦截器与切片
Java实现文件批量导入导出实践(兼容xls,xlsx)
好文!必须点赞
UFS逻辑单元管理 介绍UFS 逻辑单元管理和配置 阅读详情

相关推荐

ST-LINK调试STM32H743必看:CubeMX工程中缺失的这行代码导致程序跑飞

本文深入剖析了使用ST-LINK调试STM32H743时,因CubeMX工程中缺失电源电压档位配置代码而导致程序跑飞或出现“Can not access memory”错误的问题。文章解释了H7系列电源与时钟耦合的核心原理,提供了具体的代码修复方案和系统化的调试排查思路,帮助开发者从根本上解决这一常见调试困境。

weixin_29191669的博客 281

涉及到Money一般不用Float 或 Double

一、原因 在涉及有关金钱的时候,数据类型一般不用 Float 或 Double。原因如下: public static void main(String[] args) { double a1 = 0.2; double a2 = 0.3; double a3 = a2 - a1; System.out.println(a3);...

Alone_in_的博客 1830

innovus:给channel加soft blockage

dbGet [dbGet top.fplan.pBlkgs.name finishfp_place_blkg_* -p].boxes就可以获得channel坐标。意思是给30um以下的channel加soft blk,至于channel的坐标,通过抓取该soft blk去获取,比较容易。工具自己加入的placement blockage命名上叫finishfp_place_blkg_*ICC2中有给channel自动加soft blockage的命令,相应的innovus也有类似的命令,我们可以使用。

m0_61544122的博客 484

Java开发中金钱计算的精度问题

在自己编写程序的过程中,或多或少会涉及到金钱的内容。其中由于大部分国家最小单位是分,double变量就成为大部分人首选的类型,但是double计算存在精度丢失的问题。缺点:有边界限制(可以转换成long扩大边界)不过实际开发中大金额基本只涉及到金融行业。在数据库建立时,使用int来记录钱的金额,以分为单位开始计算,前端输出的时候再将钱换算为以元为单位的数字。BigDecimal可以将double类型转换为字符串来进行计算,字符串就不存在精度问题了。其中原因是因为计算机内进制转化的问题。

jingjiu1002的博客 1331

开源鸿蒙具身机器人(ROS2框架):从内核驱动到智能算法的完整实践

本指导文档旨在为开发者提供完整的开源鸿蒙(OpenHarmony)具身机器人开发解决方案,涵盖从底层驱动到上层ROS2应用的全栈开发流程。文档结合OpenHarmony内核驱动移植技术和ROS2机器人操作系统,为具身机器人开发提供详细的技术指导。具身机器人(Embodied Robot)是指具有物理实体、能够感知环境并与之交互的智能机器人系统。感知-决策-执行闭环多模态传感器融合(视觉、听觉、触觉、力觉)实时环境感知与理解智能决策与规划精确运动控制执行具身智能特性物理世界交互能力。

m0_67505153的博客 1272

【第1章】基于FPGA的图像形态学处理学习教程——目录

本课程介绍图像形态学处理技术,通过腐蚀、膨胀、开运算、闭运算等算子对图像进行优化。腐蚀可去除边缘杂色使线条更清晰,膨胀能填补缺口修复图像,开运算擅长去噪,闭运算则用于修补断裂。课程内容涵盖四大形态学处理的理论分析、MATLAB仿真和FPGA开发实现,包括腐蚀、膨胀、开闭运算以及顶帽变换等操作,最后探讨形态学处理的实际应用场景。通过仿真测试和FPGA开发实践,帮助学员掌握图像"美容塑型"的核心技术。

MATLAB,verilog,python,opencv,tensorflow,caffe,C,C++ 339

Java-计算钱币

编写程序,读取用户输入的代表总金额的double值,打印表示该金额所需的最少纸币张数和硬币个数,打印从最大金额开始。纸币的种类有十元、五元、一元,硬币的种类有五角、一角、贰分、壹分。

weixin_73019796的博客 1921

SAP CBC 集成质量系统初始化接入实战指南

摘要 本文探讨了SAP S/4HANA Cloud Public Edition项目中质量系统的初始接入过程。质量系统并非开箱即用,而是需要经过SAP Central Business Configuration(CBC)的Scope and Organizational Structure阶段部署后才能具备完整功能。文章重点分析了几个关键环节:CBC里程碑确认的时机选择、Identity Authentication的初始管理员设置、Business Role Template的创建规范等。实施过程中需特

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1412

double 不能用作金钱运算

float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。之前听一个同事说,他的一个朋友因为用了double来用作金钱运算,导致被黑客利用,造成不少的损失跑路了,下面咱们就来聊聊这个问题吧。 简介 Java中的简单浮点数类型float和double不能够进行运算,或者运算会丢失精度,不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,float和double只能用来做科学计算或者是工程计算,在商业计算中我

1092

Linux系统安装部署Redis完整教程(图文详解)

最近需要在Linux服务器安装部署Redis,参考了网上很多的文章,比较零碎,所以我自己写了一篇完整的Redis安装部署文档,在部署Redis之前重装了我的华为服务器,就是为了给大家一步步阐述我的操作过程,配合图文进行讲解更加通俗易懂!

黄团团的个人博客 6694

Vue3 - Vite运行打包时Uncaught ReferenceError: process is not defined(解决vue3+vite报错process is not defined)

vue3,vite,vue3+vite报错,process,UncaughtReferenceError:processisnotdefined,浏览器控制台报错processisnotdefined解决方法,vue3如何解决报错,vite报错怎么办,前端打包UncaughtReferenceError:processisnotdefined,npmrunbuild打包报错,vite打包时出现错误,vue3打包运行找不到process,热更新会报错UncaughtRefer

🏆 前端领域优质创作者 7739

异常处理(上)

文章目录异常处理初探C方式的解决方案程序中会出现大量的处理异常的代码完整代码C++中的异常处理实例代码小结: 异常处理初探 所有的代码都有可能不按照预定义的方式运行 典型问题一: double Div(double a, double b) { return a/b; } double Add(double a, double b) { return a+b; } double Minus...

创造晴天 478

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

真不是开玩笑:同事因在涉及金钱交易中使用double造成无法挽回的损失,已跑路...

作者:Java实用技术来源:blog.youkuaiyun.com/vbirdbest/article/details/80280627在《Effective Ja...

emprere的博客 131

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Java中为什么不能用浮点数表示金额?

在Java中,不建议使用浮点数(如float和double)来表示金额,主要原因是浮点数不能精确地表示十进制小数,可能导致精度损失和计算错误。这是因为浮点数是基于二进制系统表示的,有些十进制小数在二进制表示下是无限循环的,无法精确表示。 例如,0.1在二进制中表示为0.00011001100110011...(无限循环)。当我们使用浮点数表示这样的小数时,只能截断为有限位数,这会导致精度损失。当进行加法、减法、乘法和除法等运算时,这种精度损失可能会累积,导致结果不正确。 为了避免这种情况,建议

weixin_72084017的博客 1220

Java——double类型精度运算

写在前面——接近年底,项目遇到很多报表、结算等类型的需求,自然就会遇到很多double类型的逻辑运算,正巧之前没有总结过这方面的东西,所以就有了这篇帖子。 最开始做的时候比较渣,没有注意两个double类型做逻辑运算最后得到的数字是有误差的(原谅我这个时候有些粗心了),如下所示: public static void main(String[] args) { double a=1.4...

鹿慕溪水的博客 1766

[JAVA] float,double计算方法

转载自:http://blog.youkuaiyun.com/aya19880214/article/details/45891581 1、float整数计算误差案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结果出现误差。原因:超出float精度范围,无法精确计算。float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含

Danny Chen的专栏 4643

Java使用double计算金额精度丢失问题以及JavaScript浮点数计算精度丢失问题解决办法

一、在使用Java中使用double做为单价计算金额的时候会出现精度丢失的问题。 解决办法 : 使用大数据运算类 ---> BigDecimal类。具体看下面代码 //计算金额 //转型防止丢失精度 BigDecimal bigDecimalPrice = new BigDecimal(String.valueOf(goods_price)); BigDecimal bigDecimalTotal = new BigDecimal(goo

码不多的博客 3024

【C编写程序设计】定义和调用如下函数:double add(double x,double y);double sub(double x, double y);double mul(double x)

编写程序,定义和调用如下函数: double add(double x,double y); double sub(double x, double y); double mul(double x, double y); double div(double x, double y); 求两个浮点数的和、差、积、商,要求通过函数指针回调函数。一行中输人两个浮点数,以空格间隔。分行输出两个浮点数的和、差、积、商。

TIG_JS的博客 1912

python精度丢失_double类型计算精度丢失问题及解决方法

public class Test{public static void main(String [] args){System.out.println(0.06+0.01);System.out.println(1.0-0.42);System.out.println(4.015*100);System.out.println(303.1/1000);}}输出0.0699999999999999...

weixin_28738983的博客 2965

java中,数值型Double运算出错问题

在java中(在python,js其他语言中也存在),某些double型数值运算会出错,例如0.1+0.2或者0.1*3会得到结果0.30000000000000004,网上有人提出解决办法如下:       Floati=3*0.1;    System.out.println(i); 但是对于0.9*1这种运算又会出现问题,用上述办法解决不了,所以,最好采用保留精度的方法,即设定保留小数

XiaoKanZheShiJie的专栏 2085

java临时存储_关于java:使用double来临时存储货币值?

本问题已经有最佳答案,请猛点这里访问。很明显,在处理货币问题时,Double&Co.并不是一个好的选择。不过,我想知道,由于这个问题只在对价值进行计算时才出现,所以我假设只将货币价值存储在一个双精度值中完全没有问题,这是正确的吗?例如:1。值从任何给定的源加载到double中2。值被修改,直接由用户输入。三。值以适当的格式存储到磁盘。在上面的例子中,double只是将值存储在内存中的一种方...

weixin_35569211的博客 324

Java为什么金额不能用double_为什么不使用Double或Float代表货币?

小编典典因为浮点数和双精度数不能准确代表我们用于货币的基数10的倍数。这个问题不仅仅针对Java,而且还针对任何使用base 2浮点类型的编程语言。在基数10中,您可以将10.25编写为1025 * 10 -2(整数乘以10的幂)。IEEE-754浮点数是不同的,但是考虑它们的一种非常简单的方法是乘以2的幂。例如,您可能正在查看164 * 2 -4(整数乘以2的幂),它也等于10.25。这不是数字...

weixin_29062613的博客 2847

金钱还在使用 Double吗?要使用 BigDecimal

Java中的简单浮点数类型float和double不能够进行运算,或者运算会丢失精度,不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal package com.xinzhi.util; /** * 引入BigDecimal工具类 */ import com.sun.org.apache.regexp.internal.RE; import c.

qq_43658155的博客 881

涉及金钱使用double的已经被公司开除了,要使用BigDecimal

作者:Java实用技术blog.youkuaiyun.com/vbirdbest/article/details/80280627一简介Java中的简单浮点数类型float和double不能够进行...

emprere的博客 409
上一篇: 答应我,别再写上千行的类了好吗
下一篇: 为什么建议使用你 LocalDateTime ,而不是 Date?
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值