2015-09-29 82 views
31

例子:Convert double to float轉換雙浮動在Java中

我面臨着與轉換doublefloat的問題。實際上,我在數據庫中存儲了一個浮點類型,即23423424666767,但是當我們從下面的代碼中獲取數據庫中的數據時,它的類型爲getInfoValueNumeric(),它是double類型。我們得到的值是2.3423424666767E13表格。

那麼我們如何獲得一個float格式的數據,如23423424666767

2.3423424666767E13 to 23423424666767

public void setInfoValueNumeric(java.lang.Double value) { 
    setValue(4, value); 
} 


@javax.persistence.Column(name = "InfoValueNumeric", precision = 53) 
public java.lang.Double getInfoValueNumeric() { 
    return (java.lang.Double) getValue(4); 
} 

瞭解更多:Convert double to float in Java

+3

只是將其丟雙d = 3.0; 浮f =(float)d; –

+0

數字看起來相同,只是sa的不同表示我的價值。 – mksteve

+0

它不適用於我 – Sitansu

回答

95

只投你的雙爲float。

double d = getInfoValueNumeric(); 
float f = (float)d; 

還要注意,原始類型不能存儲無限組數字:

float range: from 1.40129846432481707e-45 to 3.40282346638528860e+38 
double range: from 1.7e–308 to 1.7e+308 
+3

最後有人回答實際問題:) + 1(好吧,也是akhil_mittal的) – tokland

+0

無法將雙重浮動錯誤 –

+2

@JimmyKane確保使用原始類型「float」和「double」而不是對象類型「Float」,「Double」。 –

13

我建議你去檢索存儲到數據庫中的BigDecimal類型的值:

BigDecimal number = new BigDecimal("2.3423424666767E13"); 

int myInt = number.intValue(); 
double myDouble = number.doubleValue(); 

// your purpose 
float myFloat = number.floatValue(); 

BigDecimal爲您提供了很多功能。

+3

如果有人傳遞的值不是字符串,建議使用_BigDecimal.valueOf()_而不是_new BigDecimal()_。請參閱[https://dev.eclipse.org/sonar/rules/show/squid:S2111](https://dev.eclipse.org/sonar/rules/show/squid:S2111) – River

+0

好注意@河和優秀使用聲納規則鏈接。 –

+0

那個舊鏈接已經死了。這裏是另一個: https://sonar.spring.io/coding_rules#rule_key=squid%3AS2111 – River

3

要回答「如何轉換2.3423424666767E13到 23423424666767」

可以使用decimal formatter用於格式化十進制數查詢。

 double d = 2.3423424666767E13; 
    DecimalFormat decimalFormat = new DecimalFormat("#"); 
    System.out.println(decimalFormat.format(d)); 

輸出:23423424666767

+3

這不會將double值轉換爲float ...'format'方法返回一個String對象。 –

+0

之後可以毫不費力地分析字符串 –

+2

您可以隨時通過'Float.parseFloat(decimalFormat.format(d))'將字符串值轉換爲浮點數。雖然它仍然代表着科學代表性的價值,如** 2.34234241E13 **。 –

0

問題是,你的值不能被準確地存儲在單精度浮點型。證明:

public class test{ 
    public static void main(String[] args){ 
     Float a = Float.valueOf("23423424666767"); 
     System.out.printf("%f\n", a); //23423424135168,000000 
     System.out.println(a);  //2.34234241E13 
    } 
} 

的另一件事是:你沒有得到「2.3423424666767E13」,它只是存儲在內存中的數字的可視化表示。 「你如何印出」和「記憶中的東西」是兩個截然不同的東西。上面的示例向您顯示瞭如何將數字打印爲float,這可以避免您得到的科學記數法。

1

從雙倍轉換爲浮點將是一個縮小的轉換。從doc

甲基本收縮轉換可能會失去約數值的 整體大小信息,並且還可能會丟失精度和 範圍。

從double到float的基元轉換範圍縮小由IEEE 754舍入規則(第4.2.4節)的 控制。此轉換可能會丟失精度,但也會丟失範圍,導致從非零的雙精度浮點數到零浮點數和從有限雙精度浮點數的浮點數無窮大。將雙NaN 轉換爲浮點型NaN,並將雙無限轉換爲 相同符號的浮點型無窮大。

所以這不是一個好主意。如果你還是想要它,你可以不喜歡它:

double d = 3.0; 
float f = (float) d; 
0

首先,一個事實,即在數據庫中的值是一個浮動並不意味着它也符合在Java float。浮點數爲浮點數,存在各種精度的浮點類型。 Java類型floatdouble都是不同精度的浮點類型。在數據庫中都稱爲FLOAT。由於doublefloat的精確度更高,因此您可能會丟失精度,因此而不是可能會將您的值轉換爲float

您也可以使用BigDecimal,它們表示任意精度數字。

1

Float.parseFloat(將String.valueOf(your_number)

+2

不是很好的表現,是嗎? –

1

轉換DoubleFloat

public static Float convertToFloat(Double doubleValue) { 
    return doubleValue == null ? null : doubleValue.floatValue(); 
} 

double轉換到Float

public static Float convertToFloat(double doubleValue) { 
    return (float) doubleValue; 
}