2016-10-11 56 views
0

我有一項任務,讓人們輸入形狀和邊長/半徑,並給出一個面積和周長/周長。然而,我所遇到的問題已經超出了我的深度。雙倍長度卡在17

area = (Math.PI) * (radius) * (radius); 
circumference = 2 * Math.PI * radius; 
System.out.printf("The circumference is: %f\n", circumference); 
System.out.printf("The area is: %f\n", area); 
String areaString = String.valueOf(area); 
String perimeterString = String.valueOf(circumference); 
System.out.println("Total number of digits in the circumference is: " + areaString.length()); 
System.out.println("Total number of digits in the area is: " + perimeterString.length()); 

這是代碼。之前輸入了半徑。如果它有任何區別,那麼該區域是一個雙精度值,用戶輸入的值是一個整數。因此,代碼的輸出是:

The circumference is: 69.115038 
The area is: 380.132711 
Total number of digits in the circumference is: 17 
Total number of digits in the area is: 17 

因此,我認爲正在發生的事情是double的長度其實比被打印出來(PI明顯不合理)。但是,當我改變第一個print語句:

System.out.println("Total number of digits in the circumference is: " + (areaString.length()-1)); 

日食仍然打印出17.如果還有人有更多的經歷我將不勝感激一些建議。

回答

3

這個結論似乎不可避免,%f做了一個不同於String.valueOf轉換。

但是後退:這整個目標是真的,深深地不起作用。測量double中的「小數位數」不是您可以做的事情。如果您添加0.10.2,則會得到0.30000000000000004,請參閱here。這是不可避免的double的方式存儲。所以「十進制數字」的數量真的沒有意義。

+0

你覺得我應該怎麼做?我需要能夠獲得任務的位數,這種方法就是一些同學告訴我他們這樣做了。 –

+1

爲了闡明爲什麼'%f'表現不同,[javadoc](https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html#dndec)說:*如果精度沒有指定,那麼默認值是6. *這就是爲什麼這兩個值在小數點後面打印6位數字,無論該值的實際精度如何。 – Andreas

+0

@ConradMelcher這將是一個非常奇怪的任務,要求「double」值中的數字位數。什麼是確切的措辭? –