java 里大于且小于_java-浮点数大于或小于零
我有以下代碼,有時返回為true,有時不返回.
任何想法可能導致變化的結果嗎?
0.00字符串來自JSON對象.
(代碼簡化)
if(new Float("0.00")>0){
// do something
}
編輯:
我有一些浮點數(shù),我想確定它是否為零,小于零或大于零.值可以是0.00、0.001或-0.001之類的值.如何確定它們是正數(shù),負數(shù)還是零?
編輯:
也許我應該澄清我如何獲得價值觀.我可能完全是其他導致問題的原因,因為我閱讀了有關BigDecimal的內容,并嘗試無濟于事.
使用以下代碼從JSON feed(格式為LT:0.000)中提取值:
price = new BigDecimal(stocksJSONArray.getJSONObject(i).getString("LT"));
然后,為了測試價格是大于還是小于零,我使用了以下條件語句:
if(price.compareTo(BigDecimal.ZERO)==1){
// greater than zero
}
else if(price.compareTo(BigDecimal.ZERO)==-1){
// less than zero
}
對于從JSON提要中讀取的許多值,此代碼將循環(huán)執(zhí)行.從結果中可以看出,一些零價格被處理為大于零,而某些價格被處理為小于零.我懷疑其他原因導致了這里的問題?
我還進行了測試,以查看問題是否出在數(shù)據(jù)的準確性上.所以我這樣做:
DecimalFormat frmt = new DecimalFormat("0.000000000000000000000000");
String formatted = frmt.format(stock.change);
對于被識別為正數(shù)和負數(shù)的零,其跟蹤值仍為0.000000000000000000000000,而不是0.000000000000000000000001或類似的值.
解決方法:
您的表達式將在Java中可靠地產生false的結果.
但是,假設零是例如-1除以加無窮大的結果.在這種情況下,它內部將表示為-0.00.在某些情況下,它仍將打印為零(無負號),而在其他情況下,其行為將不同于0.00.
浮點數(shù)通常可以用小于-的方式與整數(shù)進行比較-存在四舍五入誤差的風險,但是通過添加或減去一個隨機的小值無濟于事.與平等比較有所不同.
我建議您仔細檢查有關浮點行為的事實和do more reading.
編輯:我在上面大大簡化了回答原始問題.為了回答對該問題的編輯,我們需要更深入地研究.
對于浮點數(shù)的任何運算,應該知道并考慮輸入的精度和準確度以及所需的輸出精度.有時任務可以解決,有時卻不能解決-輸入精度可能不足以產生答案.
在您的情況下,精度為32位,其中尾數(shù)為24位,指數(shù)為8位.這意味著該數(shù)據(jù)類型可以將0.00100001與0.001區(qū)別開來,而與0.001000001區(qū)別開來,您可以很容易地看到:
System.out.println((float)0.001 < (float)0.001000001);
(請注意,如果不通過強制轉換進行單精度比較,則會得到不同的結果.在這種情況下,計算將以雙精度進行,并且可以安全地區(qū)分數(shù)字,直到將它們拉近為止.)
因此,精度取決于數(shù)據(jù)類型.不太準確.確定輸入精度通常要比精度更具挑戰(zhàn)性,因為它與數(shù)據(jù)類型無關,只是精度永遠不會比精度好.
關于特定浮點類型的可表示性,數(shù)學實數(shù)可以在四種可能的情況下找到自己的位置,它們對應于以人類可讀的十進制表示形式以字面值出現(xiàn)時所接受的不同處理.
>可以用二進制準確表示.例如,0或0.25.然后,它與整數(shù)變量中的整數(shù)一樣準確.
>或可以近似表示,其精度與類型的精度相對應.例如1/3或0.1或0.001.當所需的指數(shù)適合可用的指數(shù)位數(shù)時,但是當該數(shù)字的二進制擴展數(shù)長于尾數(shù)或完全無窮大時,就會發(fā)生這種情況.
>或近似可表示,且準確性嚴重失真.這些是denormal(非正常)數(shù)字.這不僅是不準確的,而且它的算術運算可能會減慢到爬網(wǎng)的速度,這通常被記錄為正確的行為,即使是受人尊敬的Java編譯器,在看到這種類型的文字(可能是bug)時也會冒汗.
>否則根本就不合適,編譯器會拒絕該字面量太大.
因此,在您的情況下,我們只有三個有效的輸入:0(準確),0.001(近似)和-0.001(近似),這可以解決您的問題.只需將您的數(shù)字與0文字(順便說一句是準確的)進行比較,您將始終獲得期望的布爾值(完全準確的輸出).
但是,這取決于您的輸入是直接從文字中派生的.如果您輸入的值是0.001,-0.001和(float)1000 *(float)0.001-1之一,那么這將是一個不同的問題,您將必須獲得答案,例如:
if (-0.00001 < x && x < 0.00001) // then x is zero
而且,如果您允許任何輸入,而不僅僅是這三個魔術值,并且不知道輸入的準確性,那么這就是不可能的任務.即使是從0.000000000 …開始的文字,最后還有一些垃圾數(shù)字也將被Java編譯器轉換為完全中性的零,在這種情況發(fā)生之后,再也沒有任何Java代碼會從準確和美觀的角度告訴它0.00,或者如果您在下溢值上添加減號,會發(fā)生什么.它是變量中所有相同的,不準確的零,相同的位模式,而不是3個不同的值.
標簽:java,android
來源: https://codeday.me/bug/20191101/1983248.html
總結
以上是生活随笔為你收集整理的java 里大于且小于_java-浮点数大于或小于零的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: HTB靶机:RainyDay
- 下一篇: 通过调用rundll32.exe来打开一
