日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

poj doubles_余数运算符在Java中用于Doubles

發布時間:2023/12/3 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj doubles_余数运算符在Java中用于Doubles 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

poj doubles

我在OSU任教已近兩年了,這總是令我驚訝,我從學生那里學到了多少。 例如,過去, 我讓學生寫一些我不理解的奇怪代碼 。 在這一點上,即使經過300多個博客文章, 幾個YouTube視頻 ,甚至還收集了100多種語言的代碼段 ,您都認為我已經看完了。 好吧,最近,我看到一個學生在雙打上使用余數運算符( % ),從那以后我就再也沒變過。

余數與模運算符

在開始講故事之前,我想先介紹一下余數運算符和模數運算符。 在Java中, 沒有模運算符 。 相反, %是余數運算符。 對于正數,它們在功能上是等效的。 但是,一旦開始使用負數,我們將看到令人驚訝的差異。

我已經在有關RSA加密的文章中談到了這種區別。 就是說,我找到了另一個很棒的來源 ,可以比較Java,Python,PHP和C等各種語言中的“模”運算符。

總而言之,余數運算符的工作原理與我們期望的正數函數完全相同。 例如,如果我們采用3 % 5 ,那么我們將得到3,因為5根本就不等于3。 如果我們開始用負數計算,結果將是相似的。 例如,如果我們采用3 % -5 ,我們仍然會得到3 % -5 ,因為這就是剩下的全部。

同時,如果我們翻轉腳本并使股息為負(畢竟,余數是除法的副產品),我們將開始看到負余數。 例如, -3 % 5返回-3。 同樣, -3 % -5返回-3。

請注意,在所有這些示例中,如何在符號上有所不同的情況下獲得相同的結果。 換句話說,對于余數運算符,我們不太關心符號。 我們只想知道一個數字變成另一個數字的次數。 然后,我們偷看股息以確定征兆。

另一方面,取模運算符還有很多細微差別。 對于初學者,右側的操作數確定可能的返回值范圍。 如果該值為正,則結果將為正。 這與我們的余數運算符有點不同。

同時,左操作數確定我們在可能值范圍內循環的方向。 自然,當兩個值具有相同的符號時,這與余數運算符完美匹配。 不幸的是,它們在任何其他情況下都是完全不同的:

表達 Java(其余) Python(MOD)
3 % 5 3 3
3 % -5 3 -2
-3 % 5 -3 2
-3 % -5 -3 -3

如果您有興趣學習有關模塊化算術的更多信息,另一位學生啟發我寫了一篇有關使用模塊化算術的Rock Paper Scissors游戲的文章 。

雙打余數運算符

當我們考慮余數運算符時,通常會假設它僅與整數一起使用-至少直到最近,這才是我的理解。 事實證明,余數運算符實際上對浮點數起作用,這是有道理的。

靈感

本月初,我正在與一個學生一起在實驗室里工作,該實驗室要求他們編寫一個硬幣兌換程序。 具體來說,該程序應該接受用戶的許多美分并以美國貨幣(例如美元,半美元,四分之一,角錢,鎳幣和便士)輸出面額。

如果您正在考慮如何解決此問題,我會給您一個提示:您可以采用貪婪的方法。 換句話說,首先選擇最大的硬幣,然后計算將其中多少分成您當前的美分。 如果做對了,您甚至不需要控制流程。 但是,您可以使用數組和循環稍微清理一下代碼。 由于我懶得用Java編寫解決方案,因此這是在Python中的樣子:

3 % 5

無論如何,我有一個學生將美分解釋為美元和美分。 換句話說,他們讓用戶輸入1.5美元(而不是150美分)等美元金額。 公平地說,這不是什么大問題。 我們要做的就是將美元金額乘以100,然后將剩余的美分相加得到一個整數。

但是,那不是那個學生所做的。 取而代之的是,他們將每個面額都視為雙倍(即實數)。 然后,他們繼續使用剩下的運算符而沒有任何后果。 簡而言之,我傻眼了。 畢竟,那怎么可能呢? 您只計算長除法的余數,對嗎? 否則,您將只剩下一個小數,什么也沒剩下。

使用雙打

如果要使用美元和美分重寫上面的程序,則可能會出現以下內容:

3 % 5

而且,如果運行此命令,我們將獲得與以前完全相同的結果:一美元和一半美元。 那怎么可能?

事實證明,使用小數來計算余數是完全有效的。 我們需要做的就是計算將除數完全除數的次數。 例如, .77 % .25會“理想地”產生.02,因為這與我們不經過而達到.77的程度非常接近。

注意事項

在發現可以使用小數點后的余數之后,我立即想知道為什么我不早知道它。 當然,快速的Google搜索會向您顯示可能出現的各種錯誤行為。

例如,在前面的示例中,我聲稱.02將是.77和.25的余數,并且有點。 請參閱,在大多數編程語言中,默認浮點值具有一定的精度,該精度由基礎二進制體系結構決定。 換句話說,有些十進制數字不能用二進制表示。 這些數字之一恰好是上述表達式的結果:

3 % 5

在處理實數時,我們始終會遇到此類問題。 畢竟,有令人驚訝的十進制值數量無法用二進制表示。 結果,我們最終遇到了舍入錯誤可能導致更改算法失敗的情況。 為了證明這一點,我重寫了上面的解決方案以計算前200美分的變化:

3 % 5

為了您的理智,我不會轉儲結果,但是在該算法失敗的地方,我將分享一些金額:

  • $ 0.06(計算鎳時失敗: .06 % .05 )
  • $ 0.08(計算便士時失敗: .03 % .01 )
  • $ 0.09(計算鎳價時失敗: .09 % .05 )
  • $ 0.11(計算點數時失敗: .11 % .1 )
  • $ 0.12(計算點數時失敗: .12 % .1 )
  • $ 0.13(與$ 0.08相同)
  • $ 0.15(計算點數時失敗: .15 % .1 )
  • $ 0.16(與$ 0.06相同)

我們已經開始看到這些計算中令人震驚的部分成為四舍五入錯誤的犧牲品。 僅在最初的16美分中,我們就無法在50%的時間內產生準確的變化(忽略0)。 那不是很好!

另外,許多錯誤開始重演。 換句話說,我懷疑隨著更多的美分,這個問題會變得更糟,因為在此過程中有更多的機會舍入錯誤。 當然,我繼續并再次修改了程序以實際測量錯誤率:

3 % 5

現在,我應該以這個代碼段為前綴,使用==比較實數,這通常被認為是不好的做法。 結果,有可能我們認為一些“正確”的解決方案是錯誤的。 就是說,我認為目前這是一個足夠好的估計。

當我運行它時,我發現所有更改計算中的53.850699999999996%不正確。 具有諷刺意味的是,即使是我的錯誤計算也存在一個舍入問題。

您是否應該在雙打中使用余數運算符?

在這一點上,我們不得不懷疑在Java中對double使用剩余運算符是否有意義。 畢竟,如果舍入錯誤是一個問題,誰能相信結果呢?

就我個人而言,我的直覺會說不惜一切代價避免這種操作。 就是說,我做了一些挖掘,并且有幾種方法可以解決此問題。 例如,我們可以嘗試使用一個將浮點值表示為整數字符串的類(例如Python中的Decimal類或Java中的BigDecimal類)在另一個基礎上執行算術。

當然,這些類型的類都有其自身的性能問題,并且無法擺脫以10為底的舍入錯誤。畢竟,以10為底的值不能代表三分之一。 也就是說,使用余數運算符將獲得更多成功。

但是,歸根結底,我個人還沒有遇到這種情況,并且我懷疑您是否也會這樣做。 當然,如果您在這里,很可能是因為遇到了這個確切的問題。 不幸的是,我沒有為您提供很多解決方案。

無論如何,謝謝您的光臨。 如果您發現本文有趣,請考慮分享。

翻譯自: https://www.javacodegeeks.com/2020/02/the-remainder-operator-works-on-doubles-in-java.html

poj doubles

總結

以上是生活随笔為你收集整理的poj doubles_余数运算符在Java中用于Doubles的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。