推断最小可能的数据类型而不会降低精度

时间:2018-07-24 15:55:25

标签: java floating-point inferred-type

我有一个输入,即String。输入将始终是十进制数字的String表示形式,例如以下示例之一:

  3.14159265
  314159265
  314159265e5

我定义了一个名为enum的{​​{1}},它有两个成员:TypesTypes.FLOAT

我想编写一个函数,该函数将为可以表示为Types.DOUBLE的所有输入返回Types.FLOAT,而不会丢失精度,而为所有输入返回float其他可以表示为Types.DOUBLE准确性不高的广告。如果该数字对于double而言过于准确,则应返回类似double的数字。

众所周知null的大小为32位,而float的大小为64位。 将double投射到double会导致准确性下降,因此例如:

float

一些需要清除的东西:

  • 我实际上并不想将我的输入解析为这些类型之一。 我只需要这些信息,就可以将其传递给Hive
  • 不使用最小准确度数据类型是不可接受的。

1 个答案:

答案 0 :(得分:1)

浮点数有2个主要部分,即有效数和指数。根据维基百科:https://en.wikipedia.org/wiki/IEEE_754 32位可以代表7.22位数字和-126:127的指数。双精度数可以处理指数中的15.95位和-1022:1023位。

所以我会做类似下面的事情(sudo代码)

public static FloatingPointEnum getType(String number){

    // Looks for the digits ignoring possible leading / trailing zeros
    int numDigits = getDigits(number);

    // Counts the leading / trailing zeros
    int exponent = getExponent(number);

    if(numDigits < 7 && exponent > -126 && exponent < 127){
        return _32Bit; 
    } else if(numDigits < 15 && exponent > -1022 && exponent < 1023){
        return _64Bit;
    } else {
        return null;
    }
}
相关问题