2013-03-05 54 views
10

正如從OracleJava爲什麼要將long(64)轉換爲float(32)考慮擴大?

參考從Oracle Docs

加寬原語轉換 19上的原始類型特定的轉換被稱爲擴大原始轉化規定:

  1. 字節到短型,整型,long,float或double
  2. 短整數,長整數,浮點數或雙整數
  3. 炭爲int,長整型,浮點,或雙
  4. INT到長整型,浮點,或雙
  5. 長浮動或雙
  6. 浮子加倍

如果浮子具有32位和長具有64如何被所考慮加寬?這不應該被認爲是縮小?

+0

我認爲它與精度有關。我只能想到:) – kaysush 2013-03-05 16:42:36

+0

你說:「*如果一個長有32位和一個長有64 *」...讓你的頭腦起來 – Bohemian 2013-03-05 16:44:56

+0

我不明白你的問題:如果一個長有32位和一個長期以來有64位如何擴大?這不應該被認爲是縮小?長數據類型是java中的一個64位有符號二進制補碼整數。請參考以下鏈接: http://docs.oracle。com/javase/tutorial/java/nutsandbolts/datatypes.html – Gourabp 2013-03-05 16:43:23

回答

18

可由floatdouble表示的值的範圍遠大於可由long表示的範圍。儘管從long轉換爲float時可能會丟失有效數字,但它仍然是「擴大」操作,因爲範圍更寬。

Java Language Specification, §5.1.2

int或長值的擴大轉換浮動,或長值加倍的,可能導致精度的損失 - 即,其結果可能會丟失一些的值的最低有效位。在這種情況下,使用IEEE 754輪到最近模式(§4.2.4),得到的浮點值將是整數值的正確舍入版本。

。請注意,double可以完全代表每一個可能的int值。

+2

@ Mrshll187 - 實際上,「float」是32位,其中8位用於指數。只有24位可用於表示尾數。我不知道「我可以達到64位」意味着什麼。浮點數可以表示1.40129846432481707e-45到3.40282346638528860e + 38範圍內的一些數字(以及一些特殊值,如NaN和±無窮大)。 「long」可以表示範圍爲-9,223,372,036,854,775,808至+9,223,372,036,854,775,807的所有數字。您可以將每個類型名稱視爲數字子集的名稱。子集重疊,但每個子集都有其他元素。 – 2013-03-05 17:04:50

+0

謝謝泰德!正如我所想的那樣,我正在很難把握這一點。 – 2015-02-18 21:42:11

2

這被認爲在擴大,因爲floatdouble可以代表比long更大的值。您可能會失去精確度,但可以表示該值(至少近似)。

2

它被認爲是在擴大,因爲float可以表示的數字大於long可以表示的數字。僅僅因爲float使用32位精度並不意味着它可以表示的數字被限制在2^32。

例如,浮點數(float)Long.MAX_VALUE+(float)Long.MAX_VALUE大於Long.MAX_VALUE,儘管浮點數的精度較低。

相關問題