用整数类型处理货币

decimal_for_cpp:C ++的十进制数据类型 关于 十进制数据类型支持,用于对货币/货币值进行类似于COBOL的定点运算。 作者:Piotr Likus 创建于:2011年3月1日 修改时间:20/04/18 许可证:BSD 版本:1.18 此数据类型旨在通过即时舍入进行计算并支持正确的比较功能(浮点比较不可靠)。 值使用64位整数在内部存储,因此最大位数为18。 精度是用户定义的,因此可以将此数据类型用于货币汇率。 要在文件中存储小数,可以使用“无偏”功能或使用流I / O。 例子 用法示例: # include " decimal.h " using namespace dec ; using namespace std ; // the following declares currency variable with 2 decimal points // initialized with integer v 立即下载

涉及到支付问题,有时相减会出现意外的结果:

public class testPay {
	public static void main(String[] args) {
		System.out.println(10.00 - 9.60);
	}
}
//结果:0.40000000000000036
**System.out.println(10.00 - 9.60); 编译的class文件使用jad反编译后**
System.out.println(0.40000000000000036D);

原因:这是因为在计算机中浮点数有可能(注意是可能)是不准确的,它只能无限接近准确值,而不能完全精确。为什么会如此呢?这是由浮点数的存储规则所决定的,我们先来看0.4这个十进制小数如何转换成二进制小数,使用“乘2取整,顺序排列”法(不懂?这就没招了,太基础了),我们发现0.4不能使用二进制准确的表示,在二进制数世界里它是一个无限循环的小数,也就是说,“展示”都不能“展示”,更别说是在内存中存储了(浮点数的存储包括三部分:符号位、指数位、尾数,具体不再介绍),可以这样理解,在十进制的世界里没有办法准确表示1/3,那在二进制世界里当然也无法准确表示1/5(如果二进制也有分数的话倒是可以表示),在二进制的世界里1/5是一个无限循环小数。

详细可以查看 IEEE二进制浮点数算术标准

表示方法:符号位 + 幂指位 + 数值位

符号位幂指位数值位
float1823
double11152

0.4
符号位 :0
幂指位:01111111 (默认值)
数值位: 01100110 01100110 0110011
0.4 * 2 = 0.8 0
0.8 * 2 = 1.6 1
0.6 * 2 = 1.2 1
0.2 * 2 = 0.4 0
0.4 * 2 = 0.8 0
…
这里写图片描述
错误处理:
结果是0.4,看似解决了,大批量数据还是会出现误差。

import java.text.DecimalFormat;
import java.text.NumberFormat;

public class testPay {
	public static void main(String[] args) {
//		System.out.println(10.00 - 9.60);
		NumberFormat f = new DecimalFormat("#.##");
		System.out.println(f.format(10.00 - 9.60)); 
		//结果 0.4
	}
}

解决方法
A:使用BigDecimal BigDecimal是专门为弥补浮点数无法精确计算的缺憾而设计的类,并且它本身也提供了加减乘除的常用数学算法。Java BigDecimal详解 http://blog.youkuaiyun.com/jackiehff/article/details/8582449
Android除法运算,保留小数

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;

public class testPay {
	public static void main(String[] args) {
		// System.out.println(10.00 - 9.60);
		// NumberFormat f = new DecimalFormat("#.##");
		// System.out.println(f.format(10.00 - 9.60)); //结果 0.4
		BigDecimal b1 = new BigDecimal(Double.toString(10.00));
		BigDecimal b2 = new BigDecimal(Double.toString(9.60));
		System.out.println(b1.subtract(b2).doubleValue()); // 结果 0.4
	}
}

B:使用整型 把参与运算的值扩大100倍,并转变为整型,然后在展现时再缩小100倍。之前项目上使用的银联支付传的价格单位就是分,用的就是这个方法。

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;

public class testPay {
	public static void main(String[] args) {
		// System.out.println(10.00 - 9.60);
		// NumberFormat f = new DecimalFormat("#.##");
		// System.out.println(f.format(10.00 - 9.60)); //结果 0.4
		// 使用BigDecimal
		// BigDecimal b1 = new BigDecimal(Double.toString(10.00));
		// BigDecimal b2 = new BigDecimal(Double.toString(9.60));
		// System.out.println(b1.subtract(b2).doubleValue()); // 结果 0.4
		// 扩大100倍 在缩小
		System.out.println((10.00 * 100 - 9.60 * 100) / 100);// 结果 0.4
	}
}

我是IT小王,如果喜欢我的文章,可以扫码关注我的微信公众号
在这里插入图片描述

currencyFormat:格式化input输入框的货币金额 currencyFormat 格式化input输入框的货币金额,默认保留两位小数,格式化为¥ #使用方法 $('.currency').currencyFormat(); 或 var options = { sign:"$", digit: 3 } $('.currency').currencyFormat(options); 立即下载

相关推荐

C++语言算法:大整数去掉N个数使其值最小

此为C++语言算法:大整数去掉其中N个数使所得到的数值为最小!

Java 规约笔记

浮点数之间的等值判断,基本数据类型不能用== 来比较,包装数据类型不能用 equals 来判断。 说明: 浮点数采用“尾数+阶码” 的编码方式,类似于科学计数法的“有效数字+指数” 的表示方式。二进 制无法精确表示大部分的十进制小数,具体原理参考《码出高效》 。 反例: float a = 1.0F - 0.9F; float b = 0.9F - 0.8F; if (a== b) { // 预期进入此代码块,执行其它业务逻辑 // 但事实上 a==b 的结果为 false } Float x = Floa

cjh的博客 2064

Maven证书信任危机:PKIX path building failed的全面解析与实战修复

本文全面解析了Maven构建中常见的`PKIX path building failed`证书验证错误。该错误通常在使用特定镜像仓库或自建仓库时,因SSL/TLS证书不被JDK默认信任而触发。文章深入剖析了错误根源,对比了临时忽略检查与永久导入证书等不同修复方案的安全性与适用场景,并推荐通过`keytool`将证书导入JDK信任库的根治方法,以保障构建安全与稳定。

zzz56的博客 506

【BigDecimal】货币金额和浮点数处理注意事项

【货币金额和浮点数处理注意事项】 (1)【强制】任何货币金额,均以最小货币单位且整型类型来进行存储。 (2)【强制】浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用 equals 来判断。 说明:浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数”的表示方式。二进 制无法精确表示大部分的十进制小数,具体原理参考《码出高效》。 反例: float a = 1...

weixin_44823875的博客 2754

使用freesurfer和3Dslicer进行脑区分割和电极定点(详细版)

1、安装好matlab和freesurfer2、在目标位置创建文件夹3、开放权限4、将需要计算的nii文件放入文件夹。

zQIANYUN的博客 5629

ARM与PC共享文件方式【samba】移植与配置

方式推荐指数适用平台优点缺点⭐⭐⭐⭐⭐全平台 (Win/Mac/Linux)兼容性最强,操作像本地文件配置稍繁琐,协议开销略大NFS⭐⭐⭐⭐Linux/Mac (Win支持一般)速度极快,CPU占用低Windows配置复杂,权限管理较难SFTP (SSH)⭐⭐⭐⭐全平台 (需客户端)安全加密,无需额外配置服务需使用FileZilla/Xftp等专用软件物理U盘⭐⭐⭐全平台无需网络,速度取决于接口需要人工插拔,不适合自动化Syncthing⭐⭐⭐⭐全平台自动同步,支持远程。

浩瀚之水的专栏 263

2021.11.9 孤尽训练营D15——java代码避坑指南

大纲:浮点数据的处理、日期数据的处理、控制语句的避坑规范、优雅的面向对象 浮点数据处理: 在计算机中,用浮点数近似表示任意某个实数,它无法精确表示一个数据,整型数据才可以精确表示一个值。 货币数据类型的选择:任何货币金额均以最小货币单位且整型类型来进行存储。 0.1默认是double类型 浮点数据类型的问题:精度丢失 单精度存储示例:(5.2) 首先转换整数部分,即 5 变成二进制101 小数部分相当于是2^(-1)一直到2^(-N)的和 乘二取整法:我们可以把十进制的小数部分乘以2.

Kiaaaa的博客 730

笔试题-2023-星宸-数字IC设计【纯净题目版】

4 笔试题-2023-星宸-数字IC设计【纯净题目版】

w0shishabi的博客 1172

C++ 强货币类型

#ifndefRMB_H_ #defineRMB_H_ typedefdoubleYuan; typedefunsignedlongCent; classRMB{ public: RMB(); RMB(Centcent); RMB(Yuanyuan); RMB...

chijiaozhao5384的博客 455

SAP SLT REODPS_REPL API 的使用介绍

本文聚焦 SAP 数据复制生态中的 RODPS_REPL(常被误写为 REODPS_REPL),解析其作为 ODP(Operational Data Provisioning)标准接口的核心功能与应用场景。RODPS_REPL 是 SAP 提供的 ABAP 接口集合,支持从 ODP 上下文(如 ODP_SAPI、ODP_CDS)执行初始化装载和增量捕获,被 SAP BW、Datasphere 及第三方工具(如 Azure Data Factory、Qlik Replicate)广泛调用。 关键要点: 核心对

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

【DRAM存储器五十六】LPDDR5介绍--WCK2CK Leveling和Read gate training

简述LPDDR5 WCK2CK leveling和read gate traning基本原理与操作步骤

highman110的博客 8789

阿里一面:为什么货币金额计算存储用 int 整型?

前段时间有同学在后台问了一个面试题,为什么金额存储和计算用 int 整型,觉得还挺有意思的,就大概讲一下。,最小货币单位用RMB来说就是分作为单位,但是这个整型存储怎么理解呢?我们这篇文章就来讲一下。

面向生活编程 1005

【车载以太网】【AVB/TSN】IEEE802.1Qav队列及转发协议

目录 一、概述 二、优先级排队算法 三、基于信用的流量整形算法 一、概述 IEEE 802.1Qav 队列及转发协议(Qav)针对不同数据流选择不同的传输选择算法来保障对时间敏感的 AV 数据流的实时传输。为了避免传统的异步以太网数据流量与 AVB 流量之间对网络资源的竞争,AVB 交换机内使用优先级排队算法和基于信用的流量整形算法实现数据流的调度。 二、优先级排队算法 优先级排队算法主要用于传统以太网数据流(BE, Best Effort)的调度传输,BE 流通过基于优先级...

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 4687

[改善Java代码]用整数类型处理货币

建议22:用整数类型处理货币. 1 public class Client { 2 public static void main(String[] args) { 3 System.out.println("10-9.5 = " + (10 - 9.5)); 4 System.out.println("10-9.6 = " + (10...

kqixiang945的专栏 116

YOLOv8改进策略【Neck】| CGA Fusion:内容引导的注意力融合模块,空间权重引导的多模态特征自适应融合

本文记录的是利用CGA Fusion 模块改进 YOLOv8 的多模态融合部分。(Content-Guided Attention Fusion)通过内容引导注意力生成空间权重,引导高低层特征的自适应融合。本文利用模块,通过内容引导注意力生成空间权重,自适应地融合两个模态的特征,在特征融合阶段实现跨模态语义对齐与噪声抑制,增强对不同模态互补特征的利用能力,从而提升模型在多模态场景下的检测鲁棒性与准确性。DEA-Net: Single image dehazing based on detail-enhanc

Limiiiing的博客 282

计算机控制技术及应用

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

使用整数类型处理货币

System.out.println(10-9.6); 在console中显示:0.400000000000036  这个值不能完全精确  解决方案: 1.使用BigDecimal :这个类是专门为弥补浮点数无法精确计算而设计的类,并且本身也提供了加减乘除的常用数学算法,特别是数据库BigDecimal类型的字段映射时。BigDecimal是最优的解决方案 2.使用整型 :

Jy_wangchou的博客 544

IEM模型,地表粗糙度模拟

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

建议22:用整数类型处理货币

在日常生活中,最容易接触到的小数就是货币,比如你付给售货员10元钱购买一个9.6元的零食,售货员应该找你0.4元也就是4毛钱才对,我们来看下面的程序: public class Client { public static void main(String[] args) { System.out.println(10.00-9.60); } }   我们期望的结果是0.4,也应该是这个

你究竟是想一辈子卖糖水,还是希望获得改变世界的机会? 1751

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

关于整数类型处理货币以及BigDecimal类的使用

在java开发中经常涉及金额处理,但对于浮点数的运算时容易出现不准确的情况 一个简单的例子 System.out.println(10.00-9.60); 执行结果为 针对金额运算或者小数运算可能出现的问题的解决方案 使用BigDecimal BigDecimal能很好的处理浮点数计算无法精确计算的问题,并且本身提供了加减乘除的常用数学算法 使用整型 把数额扩大100倍变为整型,这个方法有一...

Alex的博客 802

java货币精度提升的类型_[改善Java代码]用整数类型处理货币

建议22:用整数类型处理货币.1 public classClient {2 public static voidmain(String[] args) {3 System.out.println("10-9.5 = " + (10 - 9.5));4 System.out.println("10-9.6 = " + (10 - 9.6));5 }6 }运行...

weixin_29886825的博客 137
上一篇: 使用adb命令实现支付宝半自动扫福浇水
下一篇: Android插件:关闭WIFI下微信朋友圈视频自动播放插件开发过程详解
我叫王哈哈
博客等级 码龄11年 36粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值