将double转换为Java中的float


76

我面临与转换double为相关的问题float。实际上,我将浮点类型存储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);
}

3
刚投下。双d = 3.0; 浮点数f =(float)d;
汤姆·韦伯克

这些数字看起来相同,只是具有相同值的不同表示形式。
mksteve

它对我
不起作用

如果您希望归档的格式使用NumberFormat库。如果您想缩短您的电话号码。像:10000-> 100,您可以使用math.round()
Tom Wellbrock

float没有像23423424666767这样的数字足够的精度。它只能精确到
〜7个

Answers:


188

只需将您的双曲投向花车即可。

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

4
@JimmyKane确保使用基本类型“ float”和“ double”,而不是对象类型“ Float”,“ Double”。
汤姆·韦尔布鲁克

1
嘿,汤姆(Tom)是一项昂贵的手术。您能解释一下Java在做什么吗?
山姆·奥罗佐

@SamOrozco基本上发生了两件事:1.将double值自动装箱为其对象类型。基本上,它是Double的新实例,其中包含原始double值。2.由于objectTypes Double和Float都是从Number派生的,因此可以相互转换。
汤姆·韦伯克

现在回到您的问题,因为我们将类型从Double缩小为Float而不是扩大范围。双重对象。Java必须在运行时检查潜在的ClassCastExceptions。但是我真的不能说产生多少间接费用。至于计算本身,无非就是创建对象实例(自动装箱)和检索原始值(自动拆箱)。我知道我的回答含糊不清,但希望它对您有所帮助。如果您真的有兴趣,请在Stackoverflow上查看与自动装箱相关的主题。
汤姆·韦伯克

26

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

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

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

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

BigDecimal为您提供了很多功能。


4
如果有人传递的值不是String,则建议使用BigDecimal.valueOf()而不是new BigDecimal()。参见https://dev.eclipse.org/sonar/rules/show/squid:S2111

那个旧的链接已经死了。这是另一个: sonar.spring.io/coding_rules#rule_key=squid%3AS2111

16

转换DoubleFloat

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

转换doubleFloat

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

8

这是一个很好的方法:

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

如果您将d作为基本类型,只需添加一行:

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

3

回答关于“如何将2.3423424666767E13转换为23423424666767”的查询

您可以使用十进制格式化程序来格式化十进制数字。

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

输出:23423424666767


3
这不会将双精度值转换为float ...format方法将返回String对象。
antoniodvr 2015年

之后就可以轻松解析字符串了
Tom Wellbrock 2015年

2
您始终可以通过'Float.parseFloat(decimalFormat.format(d))'将字符串值转换为float。尽管它仍然以2.34234241E13表示具有科学表示的值。
Priyambada Madala

3

从double转换为float将是缩小的转换。从文档

变窄的原始转换可能会丢失有关数值总大小的信息,也可能会丢失精度和范围。

从double到float的原始转换变窄由IEEE 754舍入规则(第4.2.4节)控制。这种转换可能会失去精度,但也会失去范围,导致非零双精度数的浮点数为零,而有限双精度数的浮点数为无穷大。双精度NaN转换为浮点型NaN,双精度无穷大转换为相同符号的浮点无穷大。

因此,这不是一个好主意。如果您仍然想要它,可以这样做:

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

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”,它只是存储在内存中的数字的直观表示。“如何打印”和“内存中的内容”是两件截然不同的事情。上面的示例向您展示了如何将数字打印为浮点数,这避免了您得到的科学计数法。


0

首先,数据库中的值是浮点数并不意味着它也适用于Java float。浮动是短期的浮点和浮点类型的存在着各种精度。Java类型float和Javadouble都是精度不同的浮点类型。在数据库中,两者都称为FLOAT。由于double精度比更高float,因此最好不要将值转换为float,因为这样可能会失去精度。

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


0

使用数据类型转换。例如:

// converting from double to float:
double someValue;
// cast someValue to float!
float newValue = (float)someValue;

干杯!

注意:

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

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

双精度是一种特定类型的浮点数,其精度比标准浮点数高(这意味着它们可以精确到小数点后的位数)。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.