一天一块钱第二天翻倍_再把钱翻倍
一天一块钱第二天翻倍
很久以前,我写了一篇关于用双倍赚钱的文章。 但是,当解决方案相当简单时,仍然是许多开发人员普遍担心的问题。
用双倍赚钱的问题
double有两种类型的错误。 它存在表示错误。 即它不能精确地表示所有可能的十进制值。 即使0.1也不完全是这个值。 根据计算也有舍入误差。 即,当您执行计算时,误差会增加。
double[] ds = {0.1,0.2,-0.3,0.1 + 0.2 - 0.3};for (double d : ds) {System.out.println(d + " => " + new BigDecimal(d));
}
版画
0.1 => 0.1000000000000000055511151231257827021181583404541015625
0.2 => 0.200000000000000011102230246251565404236316680908203125
-0.3 => -0.299999999999999988897769753748434595763683319091796875
5.551115123125783E-17 => 5.5511151231257827021181583404541015625E-17
您可以看到0.1和0.2的表示形式略高于这些值,-0.3的表示形式也略高。 当您打印它们时,您得到的更好的是0.1,而不是代表的实际值0.1000000000000000055511151231257827021181583404541015625
但是,将这些值加在一起时,会得到一个比0稍高的值。
要记住的重要一点是这些错误不是随机错误。 它们是可管理的且受限制的。
修正舍入误差
像许多数据类型(例如日期)一样,您具有值的内部表示形式以及如何将其表示为字符串。
对于double来说是这样。 您需要控制如何将值表示为字符串。 由于Java对表示错误进行少量舍入并不明显,所以这可能会令人惊讶,但是,一旦对操作也产生舍入错误,就会有些震惊。
一个常见的React是假设,您对此无能为力,该错误是不可控制的,不可知的且危险的。 放弃双倍并使用BigDecimal
但是,该错误在IEE-754标准中受到限制,并且累积缓慢。
舍入结果
就像需要使用TimeZone和Local作为日期一样,您需要在转换为String之前确定结果的精度。
要解决此问题,您需要提供适当的舍入。 有了钱,这很容易,因为您知道合适的小数位数,除非您有70万亿美元,否则舍入误差不会大到无法校正的程度。
// uses round half up, or bankers' roundingpublic static double roundToTwoPlaces(double d) {return Math.round(d * 100) / 100.0;
}// ORpublic static double roundToTwoPlaces(double d) {return ((long) (d < 0 ? d * 100 - 0.5 : d * 100 + 0.5)) / 100.0;
}
如果将其添加到结果中,仍然会出现一个很小的表示错误,但是它不够大,以致Double.toString(d)无法对其进行校正。
double[] ds = {0.1,0.2,-0.3,0.1 + 0.2 - 0.3};for (double d : ds) {System.out.println(d + " to two places " + roundToTwoPlaces(d) + " => " + new BigDecimal(roundToTwoPlaces(d)));
}
版画
0.1 to two places 0.1 => 0.1000000000000000055511151231257827021181583404541015625
0.2 to two places 0.2 => 0.200000000000000011102230246251565404236316680908203125
-0.3 to two places -0.3 => -0.299999999999999988897769753748434595763683319091796875
5.551115123125783E-17 to two places 0.0 => 0
结论
如果您有一个项目标准说应该使用BigDecimal或double,则应遵循该标准。 但是,没有充分的技术理由担心会花双倍的钱。
参考:在Vanilla Java上 ,与我们的JCG合作伙伴 Peter Lawrey 再次将钱 翻倍 。
- Java中的低GC:使用原语而不是包装器
- Java Lambda语法替代
- JVM如何处理锁
- Erlang与Java内存架构
- Java Fork / Join进行并行编程
- Java最佳实践系列
- 如何在Java中获得类似于C的性能
翻译自: https://www.javacodegeeks.com/2011/08/double-your-money-again.html
一天一块钱第二天翻倍
一天一块钱第二天翻倍_再把钱翻倍相关推荐
- 如何用耳机翻页_实现强大的翻页跳转功能
我们都知道用 php+mysql 在web 页实现数据库资料全部显示是非常简单而有趣的,数据库资料很少的情况下页面显示还是让人满意的,但是当数据库资料非常多的情况下... 近些年,很多人对于投影仪都有 ...
- evplay 翻录_如何将DVD翻录到硬盘上并在PC上播放
evplay 翻录 Are you looking to for a way to play your media DVDs without rifling through your collecti ...
- 第二证券|卡塔尔给体育烧的钱,不止世界杯
11月,世界杯史上首次在北半球冬季打响. 全世界的目光也聚焦到了卡塔尔--这个面积仅11576平方千米.人口不足300万的中东小国. 虽然面积小,卡塔尔人花钱却很大方. 本届世界杯总计2200亿美元的 ...
- 字幕翻译中翻英一分钟多少钱?
我们知道,在影视屏幕下方出现的种种文字,如影片的片名.唱词.对白.演职表.解说词以及人物介绍等都称为影视字幕.为了实现不同语种之间的影视欣赏,影视字幕翻译顺水而生.那么,如何将中文字幕翻译成英文字幕, ...
- 一个人花8块钱买了只鸡,9块钱卖了,又10块钱买回来,11块钱又卖了,他赚了多少钱
一个人花8块钱买了只鸡,9块钱卖了,又10块钱买回来,11块钱又卖了,他赚了多少钱? 这是IBM面试时的题目,有四种算法: 1.9-8=1,11-10=1,1+1=2,所以最后赚2元. 2.最初只有8 ...
- 拿两千块钱的薪水要有一万块钱的范儿
为什么80%的码农都做不了架构师?>>> 拿两千块钱的薪水要有一万块钱的范儿 文/六六(<蜗居>编剧) 这两天各大报章都在刊载我的收入几年翻了三十倍的消息. 我娘今 ...
- clickhouse大数据分析技术与实战_比Hive快500倍!大数据实时分析领域的黑马
戳蓝字"小强的进阶之路"关注我们哦! 大数据实时分析领域的黑马是ClickHouse一个用于联机分析(OLAP)的列式数据库管理系统(DBMS). clickhouse背景 俄罗斯 ...
- qtablewidget翻页禁止_PyQt—QTableWidget实现翻页功能
主要使用QTableWidget中的三个函数实现: verticalScrollBar().setSliderPosition() 设置当前滑动条的位置 verticalScrollBar().max ...
- 有多少个数既是 4 的整数倍,又是 6 的整数倍。
第十二届蓝桥杯第二次模拟赛 /* 本题总分:5 分 [问题描述] 请问在 1 到 2020 中,有多少个数既是 4 的整数倍,又是 6 的整数倍. [答案提交] 这是一道结果填空的题,你只需要算出结果 ...
最新文章
- c语言 左补1,转专业后对于C语言补修的一些体会(1)
- Python_sqlalchemy之多对多建表
- 【AI不惑境】网络的宽度如何影响深度学习模型的性能?
- linux内核杂记(5)-进程终结
- [转]JS调用Android里面的方法,Android调用JS里面的方法
- C++ 继承关系图 01
- 麻省理工MIT发布首个贝叶斯「数据清洗」机器人!
- 统计文件中以某个字母开头的单词的数目
- 那些面对面试官的“绝杀技”
- 我们如何制作xkcd样式图?
- CVPR学习(六):CVPR2019-目标跟踪
- POJPower Network (最大流)
- 从零实现深度学习框架——实现Debug功能与no_grad
- js中map和python中的map
- linux操作命令 mongo_MongoDB常用操作命令整理
- Visio 2013 Professional专业版密钥
- Java实现静态代理
- 电路分析(电路原理)
- jsp怎么做柱状图_js实现柱状图
- Git 分支合并到主干