再把你的钱加倍

总览

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

用双倍赚钱的问题

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对表示错误进行少量舍入并不明显,所以这可能会令人惊讶,但是,一旦对操作也产生舍入错误,就会有些震惊。

一个常见的反应是假设,您对此无能为力,该错误是无法控制,不可知且危险的。 放弃双倍并使用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单元测试中Assert类的用法

Assert类所在的命名空间为Microsoft.VisualStudio.TestTools.UnitTesting 在工程文件中只要引用Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll就可以使用了&#xff0c; 在这里我会举例说明Assert里面的一些主要的静态成员。 1、 AreEqual&#xff1a;方法被重载…

CocoaPods安装使用

$ gem sources --remove https://rubygems.org/ //等有反应之后再敲入以下命令 $ gem sources -a http://ruby.taobao.org/*** CURRENT SOURCES ***http://ruby.taobao.org/ //出现这个说明安装正确$ sudo gem install cocoapods 安装cocoaPods到项目的路径下 $ touch Pod…

303. 区域和检索 - 数组不可变(数组前缀和知识应用)

给定一个整数数组 nums&#xff0c;处理以下类型的多个查询: 计算索引 left 和 right &#xff08;包含 left 和 right&#xff09;之间的 nums 元素的 和 &#xff0c;其中 left < right 实现 NumArray 类&#xff1a; NumArray(int[] nums) 使用数组 nums 初始化对象 in…

pat1049. Counting Ones (30)

1049. Counting Ones (30) 时间限制10 ms内存限制65536 kB代码长度限制16000 B判题程序Standard作者CHEN, YueThe task is simple: given any positive integer N, you are supposed to count the total number of 1s in the decimal form of the integers from 1 to N. For ex…

加油站会员管理系统源码php_加油站使用会员管理系统,如何解决行业瓶颈?

随着人们生活条件的不断改善&#xff0c;基本上家家户户都有了私家车辆&#xff0c;这对于加油站而言&#xff0c;覆盖的客户量也逐渐增多。现在很多加油站还是处于比较传统的收银模式和会员营销管理模式&#xff0c;收银效率低&#xff0c;客户得不到全方面的管理。尤其是在高…

专2-第二课 Eclipse开发环境搭建

2.1下载Eclipse 2.2 安装C/C版本的Eclipse 2.3 安装JDT插件开发Java程序 2.4 使用Eclipse开发驱动程序 既然安装了eclipse来进行驱动学习&#xff0c;那么我们就先来试试看eclipse开发驱动的大致流程。这里以Linux设备驱动作为示列给读者展示整个流程&#xff0c;Android底层的…

使用JAXB从XSD生成XML

这是最初由JCG合作伙伴 Experiences Unlimited的Mohamed Sanaulla发表的帖子。 Mohamed解释了如何使用JAXB从给定的XSD生成XML 。 &#xff08;注意&#xff1a;对原始帖子进行了少量编辑以提高可读性&#xff09; 我们可以使用JAXB使用给定的Schema将Java对象编组为XML&#…

tkinter 菜单添加事件_Tasker的最新测试劫持了Android 11的电源菜单

流行的Android自动化应用Tasker 最近收到了重大更新&#xff0c;为该应用引入了许多新功能。该更新包括解锁应用程序读取手机上任何传感器以触发任务的功能&#xff0c;使您可以通过任何第三方应用程序自动发送短信或拨打电话的功能&#xff0c;完全请勿打扰自定义功能。通过链…

CLR via C#(18)——Enum

1. Enum定义 枚举类型是经常用的一种“名称/值”的形式&#xff0c;例如&#xff1a; public enum FeedbackStatus { New, Processing, Verify, Closed } 定义枚举类型之后我们在使用时方便了许多&#xff0c;不用再记着0代表什么状态…

PHP中 magic_quotes_gpc 和 magic_quotes_runtime 区别及其反斜线转义问题

php中关于反斜线转义&#xff1a;php中数据的魔法引用函数 magic_quotes_gpc 或 magic_quotes_runtime 设置为on时&#xff0c;当数据遇到 单引号 和 双引号" 以及 反斜线\ NULL时自动加上反斜线&#xff0c;进行自动转义。注释&#xff1a;默认情况下&#xff0c;PH…

JDK中的设计模式

Zen的JCG合作伙伴Brian Du Preez 是IT艺术领域的合作伙伴&#xff0c;他在收集JDK中最常见的设计模式方面做得非常出色。 模式列表确实令人印象深刻且很长&#xff0c;所以让我们不再ba不休&#xff0c;向您展示它。 前几天&#xff0c;我在企业Dev中看到了Rob Williams Brain …

414. 第三大的数

给你一个非空数组&#xff0c;返回此数组中 第三大的数 。如果不存在&#xff0c;则返回数组中最大的数 方法一 首先将数组排序&#xff0c;然后通过集合去除重复的元素&#xff0c;最后进行一次判断&#xff0c;选择第三大元素还是最大元素 class Solution {public int thir…

bufferevent 与 socket

http://blog.sina.com.cn/s/blog_56dee71a0100qx4s.html 很多时候&#xff0c;除了响应事件之外&#xff0c;应用还希望做一定的数据缓冲。比如说&#xff0c;写入数据的时候&#xff0c;通常的运行模式是&#xff1a; l 决定要向连接写入一些数据&#xff0c;把数据放入到缓冲…

Codeforces Round #102 (Div. 1) A. Help Farmer 暴力分解

A. Help Farmer题目连接&#xff1a; http://www.codeforces.com/contest/142/problem/A Description Once upon a time in the Kingdom of Far Far Away lived Sam the Farmer. Sam had a cow named Dawn and he was deeply attached to her. Sam would spend the whole summe…

电力电子、电机控制系统的建模和仿真_清华团队研发,首款国产电力电子仿真软件来啦~已捐赠哈工大、海工大、清华使用!...

点击上方电气小青年&#xff0c;关注并星标由于微信改版&#xff0c;只有星标才能及时看到我们的消息哦━━━━━━推荐阅读&#xff1a;《膜拜大神&#xff01;清华大学电机系2021年接收推荐免试直硕(博)生拟录取名单公示&#xff01;》《滴滴程序员年薪80万被鄙视不如在二本…

JVM如何处理锁

当我们谈论最新版本的Sun Hotspot Java虚拟机1.6时&#xff0c;当您尝试从java.util.concurrent.locks.Lock实现获取锁或输入同步块时&#xff0c;JVM将执行以下三种锁类型&#xff1a; 有偏见的 &#xff1a;有时即使在并发系统中也没有争用&#xff0c;并且在这种情况下&…

基于node.js及express实现中间件,实现post、get

首先&#xff0c;当然是有必要的环境&#xff0c;安装node&#xff0c;这个我就不多说了。 依赖模块&#xff1a; "express": "^4.13.4", "request": "^2.72.0", "body-parser": "^1.13.3",页面 $.ajax({type: &q…

可视化分析之图表选择

转载于:https://www.cnblogs.com/yymn/p/4783631.html

定义并调用函数输出 fibonacci 序列_科学网—Zmn-0351 薛问天:再谈数学概念的定义,评新华先生《0345》...

Zmn-0351 薛问天&#xff1a;再谈数学概念的定义&#xff0c;评新华先生《0345》【编者按。下面是薛问天先生发来的文章。是对《Zmn-0345》新华先生文章的评论。现在发布如下&#xff0c;供网友们共享。请大家关注并积极评论。另外本《专栏》重申&#xff0c;这里纯属学术讨论&…

Java和内存泄漏

总览 术语“内存泄漏”在Java中的使用方式不同于在其他语言中使用的方式。 通用术语中的“内存泄漏”是什么意思&#xff0c;在Java中如何使用&#xff1f; 维基百科的定义 当计算机程序消耗内存但无法将其释放回操作系统时&#xff0c;就会发生计算机科学中的内存泄漏&#x…