再把你的錢加倍

總覽

很久以前,我寫了一篇關于用雙倍賺錢的文章。 但是,當解決方案相當簡單時,仍然是許多開發人員普遍擔心的問題。

用雙倍賺錢的問題

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.pswp.cn/news/374551.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374551.shtml
英文地址,請注明出處:http://en.pswp.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…