一天一块钱第二天翻倍

总览

很久以前,我写了一篇关于用双倍赚钱的文章。 但是,当解决方案相当简单时,仍然是许多开发人员普遍担心的问题。

用双倍赚钱的问题

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

一天一块钱第二天翻倍

一天一块钱第二天翻倍_再把钱翻倍相关推荐

  1. 如何用耳机翻页_实现强大的翻页跳转功能

    我们都知道用 php+mysql 在web 页实现数据库资料全部显示是非常简单而有趣的,数据库资料很少的情况下页面显示还是让人满意的,但是当数据库资料非常多的情况下... 近些年,很多人对于投影仪都有 ...

  2. evplay 翻录_如何将DVD翻录到硬盘上并在PC上播放

    evplay 翻录 Are you looking to for a way to play your media DVDs without rifling through your collecti ...

  3. 第二证券|卡塔尔给体育烧的钱,不止世界杯

    11月,世界杯史上首次在北半球冬季打响. 全世界的目光也聚焦到了卡塔尔--这个面积仅11576平方千米.人口不足300万的中东小国. 虽然面积小,卡塔尔人花钱却很大方. 本届世界杯总计2200亿美元的 ...

  4. 字幕翻译中翻英一分钟多少钱?

    我们知道,在影视屏幕下方出现的种种文字,如影片的片名.唱词.对白.演职表.解说词以及人物介绍等都称为影视字幕.为了实现不同语种之间的影视欣赏,影视字幕翻译顺水而生.那么,如何将中文字幕翻译成英文字幕, ...

  5. 一个人花8块钱买了只鸡,9块钱卖了,又10块钱买回来,11块钱又卖了,他赚了多少钱

    一个人花8块钱买了只鸡,9块钱卖了,又10块钱买回来,11块钱又卖了,他赚了多少钱? 这是IBM面试时的题目,有四种算法: 1.9-8=1,11-10=1,1+1=2,所以最后赚2元. 2.最初只有8 ...

  6. 拿两千块钱的薪水要有一万块钱的范儿

    为什么80%的码农都做不了架构师?>>>    拿两千块钱的薪水要有一万块钱的范儿 文/六六(<蜗居>编剧) 这两天各大报章都在刊载我的收入几年翻了三十倍的消息. 我娘今 ...

  7. clickhouse大数据分析技术与实战_比Hive快500倍!大数据实时分析领域的黑马

    戳蓝字"小强的进阶之路"关注我们哦! 大数据实时分析领域的黑马是ClickHouse一个用于联机分析(OLAP)的列式数据库管理系统(DBMS). clickhouse背景 俄罗斯 ...

  8. qtablewidget翻页禁止_PyQt—QTableWidget实现翻页功能

    主要使用QTableWidget中的三个函数实现: verticalScrollBar().setSliderPosition() 设置当前滑动条的位置 verticalScrollBar().max ...

  9. 有多少个数既是 4 的整数倍,又是 6 的整数倍。

    第十二届蓝桥杯第二次模拟赛 /* 本题总分:5 分 [问题描述] 请问在 1 到 2020 中,有多少个数既是 4 的整数倍,又是 6 的整数倍. [答案提交] 这是一道结果填空的题,你只需要算出结果 ...

最新文章

  1. c语言 左补1,转专业后对于C语言补修的一些体会(1)
  2. Python_sqlalchemy之多对多建表
  3. 【AI不惑境】网络的宽度如何影响深度学习模型的性能?
  4. linux内核杂记(5)-进程终结
  5. [转]JS调用Android里面的方法,Android调用JS里面的方法
  6. C++ 继承关系图 01
  7. 麻省理工MIT发布首个贝叶斯「数据清洗」机器人!
  8. 统计文件中以某个字母开头的单词的数目
  9. 那些面对面试官的“绝杀技”
  10. 我们如何制作xkcd样式图?
  11. CVPR学习(六):CVPR2019-目标跟踪
  12. POJPower Network (最大流)
  13. 从零实现深度学习框架——实现Debug功能与no_grad
  14. js中map和python中的map
  15. linux操作命令 mongo_MongoDB常用操作命令整理
  16. Visio 2013 Professional专业版密钥
  17. Java实现静态代理
  18. 电路分析(电路原理)
  19. jsp怎么做柱状图_js实现柱状图
  20. Git 分支合并到主干

热门文章

  1. 战争地带2100 mac版
  2. OLTP、OLAP与HTAP
  3. HTML5学习之WebSocket通讯(六)
  4. 边学边做Unity 3D小游戏日常(二)
  5. 从高考到程序员:我的程序探险之旅
  6. android 相机 app,android – Emulator的相机内置app buggy在Froyo / 2.2?
  7. Linux如何安装集群及细节操作
  8. 不同 frame 之间调用 js 函数
  9. pdf怎么转换成jpg或png图片?
  10. 30.Android调试-连接夜深模拟器