为什么不使用float / double?

使用java时会遇到money类型的选择问题,首先想到的是float / double。如果只是简单的货币计算,很难发现用float会有问题。出现问题的原因是使用float / double(已经相应的包装类Float / Double)会出现舍入误差(rounding errors),不能精确的表示十进制数。例如下面的例子:

1 public class countMoney {

2 public static void main(String[] args) {

3 float m1 = 0.1f;

4 float m2 = 9.0f;

5 System.out.println(mulMoney(m1, m2));

6 }

7

8 private static float mulMoney(float m1, float m2) {

9 return m1 * m2;

10 }

11 }

结果输出0.90000004,而不是0.9。十进制数0.1用二进制存储,被表示的值为0.0999999999999999996。所以得到的结果并不是预期的0.9。

怎样表示money?

使用BigDecimal来表示货币。现在来重新实现这个例子:

1 public class countMoney {

2 public static void main(String[] args) {

3 BigDecimal m1 = new BigDecimal("0.1");

4 BigDecimal m2 = new BigDecimal("9.0");

5 System.out.println(mulMoney(m1, m2));

6 }

7

8 private static BigDecimal mulMoney(BigDecimal m1, BigDecimal m2) {

9 return m1.multiply(m2);

10 }

11 }

输出0.90。

BigDecimal可表示任意精度的小数,不管它的范围有多大。BigDecimal是用array来存储数字的,每一次输入表示一个数字。因此,BigDecimal可以表示任意大小的数。

另外,BigDecimal是一个类,不是基本类型,需要调用方法来实现数的运算。它有四中方法:add, subtract, multiply, 和 divide。这里m1和m2相乘采用了multiply。

表示money的其他方法?

用currency可表示世界货币。

使用int / long表示penny。

参考文献:

java钱_在Java中如何表示钱Money?相关推荐

  1. linux java 栈_关于Java中栈与堆的思考

    1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取速度比堆要快,仅次于直接位于C ...

  2. Java多线程_复习(更新中!!)

    java多线程的常见例子 一.相关知识: Java多线程程序设计到的知识: (一)对同一个数量进行操作 (二)对同一个对象进行操作 (三)回调方法使用 (四)线程同步,死锁问题 (五)线程通信 等等 ...

  3. js 中 java 代码_在js中嵌套java代码

    jsp中有时候在js中操作某些java后台传递过来的数据逻辑比较复杂,比如list内容的遍历,可以直接在页面上添加java脚本来执行内容,代码如下: //在js中插入java代码操作 //取出java ...

  4. java 企业版_下列版本中哪个是Java 企业版

    下列版本中哪个是Java 企业版 2021-02-07 下列版本中哪个是Java 企业版 张爱玲评价自己的服饰:"仿佛穿着博物院的()到处走,遍体森森然飘飘欲仙".转动惯量是刚体转 ...

  5. jython 导入java包_在jython中导入java类

    我用python处理NLP.有一个NLP工具,即Zemberek,用于土耳其语.但它是用java编写的.所以我必须使用jython来导入这些类.我安装了Jython2.7.另外,我安装了eclipse ...

  6. 修改docker内java内存_在docker中使用java的内存情况

    Java和Docker不是天然的朋友. Docker可以设置内存和CPU限制,而Java不能自动检测到.使用Java的Xmx标识(繁琐/重复)或新的实验性JVM标识,我们可以解决这个问题. 虚拟化中的 ...

  7. 沈阳5年java月薪多少钱_沈阳java工资怎么样,沈阳java工资很高吗,沈阳java工资水平如何...

    沈阳java工资怎么样,沈阳java工资很高吗,沈阳java工资水平如何 首页 > java > 沈阳java工资怎么样 作者:镀金池   发布时间:2018-12-02 05:40 Ju ...

  8. 谷歌去水印java实现_在Java中实现Google的“您的意思是”功能

    谷歌去水印java实现 介绍 搜索引擎用户经常因各种原因而拼写错误的搜索词,包括键盘问题(键不起作用),陌生的国际名称(例如Sigmund Freud),意外更改一个字母(Sinpsons)或添加一个 ...

  9. java地区_在Java中存储国家/地区代码,名称和Continent的最佳方式

    在ISO 3166中有246个国家,你可能会在此背后得到一个继电器大枚举.我更喜欢使用包含国家/地区列表的 XML文件,您可以从 http://www.iso.org/下载一个并加载它们(例如,当应用 ...

  10. java 抛物线_关于java中模拟抛物线轨迹的问题

    展开全部 看了这套题目感觉很有兴趣,就花了一e69da5e6ba903231313335323631343130323136353331333264623831个中午亲手给你写了一个类似的例子,相信可 ...

最新文章

  1. 中国人工智能AI框架自主研发
  2. linux 的一个防火墙策略
  3. 转】用Maven构建Mahout项目
  4. win7中安装mysql_windows7下安装Mysql5.6数据库图文教程(压缩包安装)
  5. spring 获取 WebApplicationContext的几种方法
  6. 宠了4年的老婆,说走就走,没有一点情份,你会怎么做
  7. 千寻和省cors精度对比_使用中海达RTK实战演示千寻cors账号对比省cors网络,验证其测量效果究竟如何...
  8. vv7无法启动显示发动机故障_点火系统故障引起发动机不能启动的排除方法
  9. c语言从1加到任意数的编程,c语言:从键盘任意输入一个整数n,编程计算并输出1-n之间的所有素数之和...
  10. linux连不上网 ens33,如何解决Linux 系统下 ifconfig 命令无网络接口 ens33
  11. NoticeBoard 一个仿原生UI的消息通知控件
  12. [转载] Python开发系列课程(16) - 进程和线程
  13. Java日常干货-观察者模式
  14. 频谱感知4:CCS硬合并中m-out-of-K准则下m与K的联合优化问题
  15. Linux 网桥 brctl
  16. CA/B论坛又出新动作了!代码签名证书最小密钥长度将于6月增强至3072位
  17. 全志F1C200S F1C100S 介绍
  18. iOS 12.0-12.1.2 完整越狱教程
  19. 睡眠十律 (BBC纪录片) -- 讲述10分钟获得好睡眠的方法
  20. 虾皮台湾店标价是用台币吗?要如何定价?

热门文章

  1. 如何把我的Java程序变成exe文件?
  2. [转帖]FPGA--Vivado
  3. 【分享】关于对象关系映射的理解
  4. ASP.NET MVC: 构建不带 Web 窗体的 Web 应用程序(转载)
  5. 爬取Github Web API 并存入Mysql数据库
  6. 获取axios的return值
  7. Leetoce--572. 另一个树的子树(java)
  8. MYSQL--一条SQL查询语句是如何执行的?
  9. android 监测bug上传到服务器,基于Android 错误信息捕获发送至服务器的详解
  10. VS2013报错:错误:没有与这些操作匹配的《运算符