【问题标题】:Convert double to float in Java在Java中将double转换为float
【发布时间】:2015-09-29 07:09:41
【问题描述】:

我遇到了将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);
}

【问题讨论】:

  • 就投吧。双 d = 3.0;浮动 f = (float) d;
  • 数字看起来一样,只是相同值的不同表示。
  • 它不适合我
  • 如果它是您希望归档的格式,请使用 NumberFormat 库。如果你想缩短你的号码。比如:10000->100 你可以使用 math.round()
  • float 对于像 23423424666767 这样的数字没有足够的精度。它只能精确到大约 7 个十进制数字

标签: java double floating


【解决方案1】:

只需将你的 double 转换为浮点数。

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

【讨论】:

  • @JimmyKane 确保您使用原始类型“float”和“double”,而不是对象类型“Float”、“Double”。
  • 嘿,汤姆,这是一项昂贵的手术。你能解释一下 Java 在底层做了什么吗?
  • @SamOrozco 这里基本上发生了两件事:1. double 值被自动装箱到它的对象类型。它基本上是 Double 的一个新实例,它保存原始的 double 值。 2. 由于objectTypes Double 和Float 都是从Number 派生而来的,它们可以相互转换。
  • 现在回到您的问题,因为我们将类型从 Double 缩小到 Float 而不是更广泛,例如。加倍对象。 Java 必须在运行时检查潜在的 ClassCastExceptions。但我真的不能说产生了多少开销。至于计算本身,无非是创建 Object 实例(自动装箱)并检索原始值(自动拆箱)。我知道我的答案含糊不清,但我希望它仍然有帮助。如果您真的感兴趣,请查看 Stackoverflow 上与自动(取消)装箱相关的主题。
【解决方案2】:

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

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

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

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

BigDecimal 为您提供了很多功能。

【讨论】:

【解决方案3】:

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;
}

【讨论】:

    【解决方案4】:

    这是一个很好的方法:

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

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

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

    【讨论】:

    • 非常优雅。我觉得使用这种方法比只强制转换更安全——即使它是错误的安全性。
    【解决方案5】:

    回答您关于“如何将 2.3423424666767E13 转换为 23423424666767"

    您可以使用decimal formatter 来格式化十进制数字。

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

    输出:23423424666767

    【讨论】:

    • 这不会将双精度值转换为浮点数...format 方法返回一个字符串对象。
    • 然后可以毫不费力地解析字符串
    • 您始终可以通过 'Float.parseFloat(decimalFormat.format(d))' 将字符串值转换为浮点数。尽管它仍然以 2.34234241E13 表示具有科学表示的值。
    【解决方案6】:

    从 double 转换为 float 将是一个缩小转换。来自doc

    缩小原语转换可能会丢失有关 数值的整体大小,也可能会丢失精度和 范围。

    从 double 到 float 的缩小原始转换由 IEEE 754 舍入规则 (§4.2.4)。此转换可能会丢失 精度,但也失去范围,导致从一个浮点零 非零双精度和来自有限双精度的浮点无穷大。双 NaN 转换为浮点 NaN,双无穷大转换为 同符号浮点无穷大。

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

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

    【讨论】:

      【解决方案7】:

      问题是,您的值无法以单精度浮点类型准确存储。证明:

      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”,它只是存储在内存中的数字的直观表示。 “你如何打印出来”和“内存中有什么”是两个不同的东西。上面的示例向您展示了如何将数字打印为浮点数,这避免了您获得的科学记数法。

      【讨论】:

        【解决方案8】:

        首先,数据库中的值是浮点数这一事实并不意味着它也适合 Java float。 Float 是 floating point 的缩写,存在各种精度的浮点类型。 Java 类型floatdouble 都是不同精度的浮点类型。在数据库中,两者都称为FLOAT。由于double 的精度高于float,因此将您的值转换为float 可能是一个更好的主意,因为您可能会丢失精度。

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

        【讨论】:

          【解决方案9】:

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

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

          干杯!

          注意:

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

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

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

          【讨论】:

            【解决方案10】:

            Float.parseFloat(String.valueOf(your_number)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-01-02
              • 1970-01-01
              相关资源
              最近更新 更多