我有一个输入,即String
。输入将始终是十进制数字的String
表示形式,例如以下示例之一:
3.14159265
314159265
314159265e5
我定义了一个名为enum
的{{1}},它有两个成员:Types
和Types.FLOAT
。
我想编写一个函数,该函数将为可以表示为Types.DOUBLE
的所有输入返回Types.FLOAT
,而不会丢失精度,而为所有输入返回float
其他可以表示为Types.DOUBLE
的准确性不高的广告。如果该数字对于double
而言过于准确,则应返回类似double
的数字。
众所周知,null
的大小为32位,而float
的大小为64位。
将double
投射到double
会导致准确性下降,因此例如:
float
一些需要清除的东西:
答案 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;
}
}