在Java中将double转换为float

106

我遇到了一个有关将double转换为float的问题。实际上,我将一个浮点类型的23423424666767存储在数据库中,但是当我们在下面的代码中从数据库获取数据时,即getInfoValueNumeric(),它是double类型。我们得到的值是以2.3423424666767E13形式呈现的。

那么,我们如何获得像23423424666767这样的float格式的数据?

2.3423424666767E13转为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);
}

3
将其转换。双精度变量 d 等于 3.0。将其转换为单精度浮点数 f = (float) d。最终结果是将双精度值 3.0 转换为等值的单精度浮点数。 - Tom Wellbrock
这些数字看起来一样,只是同一个值的不同表示。 - mksteve
它对我不起作用。 - Sitansu
如果您想要格式化数字,可以使用NumberFormat库。如果您想要缩短数字,例如:10000->100,您可以使用math.round()函数。 - Tom Wellbrock
float 对于像 23423424666767 这样的数字没有足够的精度。它只能精确到约7个小数位。 - phuclv
10个回答

232

将您的双精度浮点数转换为单精度浮点数即可。

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

9
请确保使用基本数据类型 "float" 和 "double",而不是对象类型 "Float" 和 "Double"。 - Tom Wellbrock
1
嗨,汤姆,这是一个昂贵的操作吗?你能解释一下Java在幕后做了什么吗? - Sam Orozco
@SamOrozco,基本上有两件事情会发生:
  1. 双精度值会自动装箱为其对象类型。它基本上是一个保存原始双精度值的新Double实例。
  2. 由于对象类型Double和Float都派生自Number,它们可以相互转换。
- Tom Wellbrock
现在回到你的问题,当我们将类型从Double缩小到Float时,而不是扩大例如从Double到Object。Java必须在运行时检查潜在的ClassCastExceptions。但我无法确定它产生了多少开销。至于计算本身,它只是创建对象实例(自动装箱)并检索原始值(自动拆箱)。我知道我的答案很模糊,但我希望它能有所帮助。如果您真的感兴趣,请在Stackoverflow上查看与自动(解)包装相关的主题。 - Tom Wellbrock

27

我建议您检索以BigDecimal类型存储在数据库中的值:

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

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

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

BigDecimal为您提供了许多功能。


4
如果任何人传递的值不是字符串,请使用 BigDecimal.valueOf() 而不是 _new BigDecimal()_。请参见 https://dev.eclipse.org/sonar/rules/show/squid:S2111。 - River
那个旧链接已经失效了。这里是另一个链接:https://sonar.spring.io/coding_rules#rule_key=squid%3AS2111 - River

27

Double 转换为 Float

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

double 转换为 Float

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

20

这是一个不错的做法:

Double d = 0.5;
float f = d.floatValue();

如果您的变量d是原始类型,只需添加一行代码:

double d = 0.5;
Double D = Double.valueOf(d);
float f = D.floatValue();

非常优雅。我觉得使用这种方法比仅仅强制转换更安全,即使它只是虚假的安全感。 - manuelvigarcia

5
将double类型转换为float类型是一种缩小转换。来自文档的说法如下:

缩小原始转换可能会丢失数字值的整体大小信息,也可能会丢失精度和范围。

从double到float的缩小原始转换受IEEE 754舍入规则(§4.2.4)管理。此转换可能会失去精度,而且还可能失去范围,导致从非零double到float零以及从有限double到浮动无穷大。double NaN转换为float NaN,而double无限大转换为相同符号的float无限大。

因此这不是一个好主意。如果你仍希望这样做,可以像这样进行操作:
double d = 3.0;
float f = (float) d;

3
为了回答你的问题“如何将2.3423424666767E13转换为23423424666767”,你可以使用十进制格式化程序来格式化十进制数。请参考decimal formatter
     double d = 2.3423424666767E13;
     DecimalFormat decimalFormat = new DecimalFormat("#");
     System.out.println(decimalFormat.format(d));

输出:23423424666767


3
这并不会将双精度数转换为单精度数…… format 方法返回一个字符串对象。 - antoniodvr
之后,字符串可以轻松解析。 - Tom Wellbrock
2
你可以通过使用 'Float.parseFloat(decimalFormat.format(d))' 将字符串值转换为浮点数。尽管它仍会使用科学表示法表示该值,例如 2.34234241E13 - Priyambada Madala

0
首先,数据库中的值是浮点数并不意味着它也适合于Java的float。Float是“浮点”的缩写,存在各种精度的浮点类型。Java类型floatdouble都是不同精度的浮点类型。在数据库中,两者都被称为FLOAT。由于doublefloat具有更高的精度,因此最好不要将您的值转换为float,因为您可能会失去精度。
您还可以使用BigDecimal,它表示任意精度的数字。

0
使用数据类型转换。例如:
// converting from double to float:
double someValue;
// cast someValue to float!
float newValue = (float)someValue;

干杯!

注意:

整数是整数,例如10、400或-5。

浮点数(floats)具有小数点和小数位,例如12.5和56.7786543。

双精度浮点数是一种特定类型的浮点数,它比标准浮点数具有更高的精度(这意味着它们能够准确到更多的小数位)。


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”,这只是存储在内存中的数字的可视化表示。 “如何打印输出”和“内存中的内容”是两个不同的事情。上面的示例向你展示了如何将数字作为浮点数打印出来,从而避免了你之前遇到的科学计数法问题。

-1

Float.parseFloat(String.valueOf(your_number)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接