Ⅰ java 中除法後小數精度問題
你說的這個問題涉及到數字精度問題,在程序中,數字運算總是低精度的向高精度的自動轉化。比如(int)/(float)就會得到你想要的小數數位,這是由數字在計算機中的運算方式決定的。如果你用3/5.0或者3.0/5,你就可以得到你想要的小數。
在計算機中,整型(int)和浮點(float,double)的表示形式各不相同,佔用內存空間也不同,在運算時,為了得到正確的結果,就要進行對位,如果數據類型不一致,就要進行轉化。在硬體層面上就是把佔用內存少的整型向浮點轉換,也就是為這個整型添加額外的位元組參與運算,盡管這些位元組中都是0,這是數字精度的問題。
現在是兩個整形數,運算時,計算機認為不需要進行數據類型的轉化,所以就得到你見到的結果。
Ⅱ java 中 精度計算BigDecimal 是永遠不會丟失精度的嗎,小數點後面幾位都不會
精度由BigDecimal對象在創建時設定的或默認的MathContext算術環境對象決定。
精度precision的十進制有效數字位數可以指定的。小數點後幾位等按有效數位的規則。
精度為0時,代表無限位數的准確精度。此時遇到計算1/3輸出的循環小數1.333333..會拋出算術異常,而不是返回有限的有效數字結果。
Ⅲ java中的精度是什麼意思
1.精度是指的各種數碰友據類型的位寬
byte 8 位
short 16 位
int 32 位
long 64 位
float 32 位
double 64 位
char 16 位
2.數據降級都會損失精度的,體現在各種數據類型能表示的范圍不一樣。舉個例子,float 32 位,根據 IEEE 754 32位 標准,首位正負位,後面 8 位指數位,餘下 23 位是小數位;
double 64 位,根據 IEEE 754 64位 標准,首位正負位,後面 11 位指數橋猛位,餘下 52 位是小數位。
相比之下當然位數愈多精度愈高了,其他敏吵橋整數類型的精度就簡單了,首位表示正負,所有的都表示數值,位數越高當然精度越高。
Ⅳ java能精確到小數點的後多少位
java中double類型是雙精度浮點數,佔用8位元組(Byte)即64位(bit),其精度是由32個bit的二進制尾數來確定的,因此准確精度是二進制精度而不是十進制精度,通常可以保證十進制小數點後15位有效精度和第16位的部分精度。其實這個不只是java存在,是由計算機二級制架構決定的。高精度浮點計算,最好是先轉換為整數計算後再轉為小數。相對精度比較好。
Ⅳ java程序計算精度的問題。
的確使用普通的double/float都會發生精度的問題,所以你需要使用BigDecimal這個類,網路一下他的用法,專門用來處理精度問題的
Ⅵ 怎麼控制精度在java
JAVA中如何對double或者float的浮點數進行精度計算,在JAVA中提供了多種參數來實現精度的不同控制方式。具體例子如下:行春
轉自http://stephen830.iteye.com/blog/260776
Java代碼
/*
*Createdon2005-6-5
*Authorstephen
*Emailzhoujianqiang鎮猛ATgmailDOTcom
*CopyRight(C)2005-2008,Allrightsreserved.
*/
packagecom.soft4j.utility;
importjava.math.BigDecimal;
/**
*與小數位精度(四捨五入等)相關的一些常用工具方法.
*
*float/double的精度取值方式分為以下幾種:<br>
*java.math.BigDecimal.ROUND_UP<br>
*java.math.BigDecimal.ROUND_DOWN<br>
*java.math.BigDecimal.ROUND_CEILING<br>
*java.math.BigDecimal.ROUND_FLOOR<br>
*java.math.BigDecimal.ROUND_HALF_UP<br>
*java.math.BigDecimal.ROUND_HALF_DOWN<br>
*java.math.BigDecimal.ROUND_HALF_EVEN<br>
*
*@authorstephen
*@version1.0.0
*/
publicfinalclassRoundTool{
/**
*對double數據進行取精度.
*<p>
*Forexample:<br>
*doublevalue=100.345678;<br>
*doubleret=round(value,4,BigDecimal.ROUND_HALF_UP);<br>
*ret為100.3457<br>
*
*@paramvalue
*double數據.
*@paramscale
*精度位數(保留的小數位數).
*@paramroundingMode
*精度取值方式.
*@return精度計算後的數據.
*/
publicstaticdoubleround(doublevalue,intscale,introundingMode){
BigDecimalbd=newBigDecimal(value);
bd=bd.setScale(scale,roundingMode);
doubled=bd.doubleValue();
bd=null;
returnd;
}
/**
*測試用的main方法.
*
*@paramargc
*運行參數.
御帶橋*/
publicstaticvoidmain(String[]argc){
//下面都以保留2位小數為例
//ROUND_UP
//只要第2位後面存在大於0的小數,則第2位就+1
System.out.println(round(12.3401,2,BigDecimal.ROUND_UP));//12.35
System.out.println(round(-12.3401,2,BigDecimal.ROUND_UP));//-12.35
//ROUND_DOWN
//與ROUND_UP相反
//直接舍棄第2位後面的所有小數
System.out.println(round(12.349,2,BigDecimal.ROUND_DOWN));//12.34
System.out.println(round(-12.349,2,BigDecimal.ROUND_DOWN));//-12.34
//ROUND_CEILING
//如果數字>0則和ROUND_UP作用一樣
//如果數字<0則和ROUND_DOWN作用一樣
System.out.println(round(12.3401,2,BigDecimal.ROUND_CEILING));//12.35
System.out.println(round(-12.349,2,BigDecimal.ROUND_CEILING));//-12.34
//ROUND_FLOOR
//如果數字>0則和ROUND_DOWN作用一樣
//如果數字<0則和ROUND_UP作用一樣
System.out.println(round(12.349,2,BigDecimal.ROUND_FLOOR));//12.34
System.out.println(round(-12.3401,2,BigDecimal.ROUND_FLOOR));//-12.35
//ROUND_HALF_UP[這種方法最常用]
//如果第3位數字>=5,則第2位數字+1
//備注:只看第3位數字的值,不會考慮第3位之後的小數的
System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_UP));//12.35
System.out.println(round(12.3449,2,BigDecimal.ROUND_HALF_UP));//12.34
System.out.println(round(-12.345,2,BigDecimal.ROUND_HALF_UP));//-12.35
System.out.println(round(-12.3449,2,BigDecimal.ROUND_HALF_UP));//-12.34
//ROUND_HALF_DOWN
//如果第3位數字>=5,則做ROUND_UP
//如果第3位數字<5,則做ROUND_DOWN
System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_DOWN));//12.35
System.out.println(round(12.3449,2,BigDecimal.ROUND_HALF_DOWN));//12.34
System.out.println(round(-12.345,2,BigDecimal.ROUND_HALF_DOWN));//-12.35
System.out.println(round(-12.3449,2,BigDecimal.ROUND_HALF_DOWN));//-12.34
//ROUND_HALF_EVEN
//如果第3位是偶數,則做ROUND_HALF_DOWN
//如果第3位是奇數,則做ROUND_HALF_UP
System.out.println(round(12.346,2,BigDecimal.ROUND_HALF_EVEN));//12.35
System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_EVEN));//12.35
}
}
如果要求精確控制位數,推薦使用BigDecimal,這是在JDK1.4版本之後推薦的一個處理精度的類。
Ⅶ java中如何實現N個浮點數相加並確保其精確度
用BigDecimal類來計算,先用加法計算,再用結果除以1,通過devide除法方法來確認保留幾位小數,如下例:
importjava.math.*;
publicclassDemo
{
publicstaticvoidmain(String[]args){
BigDecimalbig1=newBigDecimal(123456.23456);
BigDecimalbig2=newBigDecimal(123.456);
BigDecimalbig3=newBigDecimal(1);
BigDecimaltemp=big1.add(big2);
System.out.println(big1.divide(big3,5,BigDecimal.ROUND_HALF_UP));//保留5位小數,返回bigDecimal
}
}