浮动到字符串和后面的无损转换:是否可能?

时间:2012-01-24 16:32:18

标签: string floating-point floating-accuracy

此问题涉及C / x86上使用的IEEE标准浮点数。

是否可以将任何数字(即排除特殊值,如NaN)浮点数或双精度表示为十进制字符串,以便将该字符串转换回浮点数/双精度数将始终完全生成原始数字?

如果没有,什么算法告诉我给定的数字是否会出现转换错误?

如果是这样,请考虑这一点:当转换为二进制时,一些小数部分在数值上不会与原始十进制值相同,但反之则不正确(因为二进制具有有界精度,因此任何十进制扩展都是有限的,完美如果没有被截断),所以这是另一个问题...

是否有必要在十进制表示中引入故意错误,以便欺骗atof(或其他)函数产生确切的原始数字,或者是一个天真的,非截断的toString功能是否足够(假设一般可以进行精确转换)?

3 个答案:

答案 0 :(得分:7)

根据this page

  

实际上,IEEE754-1985标准规定17位小数是   足够在所有情况下。但是,似乎标准有点   关于合规实施是否必须保证无损的含糊不清   使用17位数时的转换。

因此,将double作为十进制字符串存储至少17位数(正确舍入)将保证它可以转换回二进制double而不会丢失任何数据。

换句话说,如果要将每个可能的双精度值转换为17位数的十进制字符串(正确舍入),它们将全部映射到不同的值。因此没有数据丢失。


我不确定单精度的最小截止值。但我怀疑它会是8位或9位数。

答案 1 :(得分:0)

鉴于IEEE格式只能表示有限数量的(二进制)数字,因此具有最小精度(参见epsilon),您只需要有限数量的(十进制)数字。当然,如果实现(strtodsnprintf)在{all floats}和{每个浮点数的一个十进制表示的集合}之间具有标识映射行为,则更可取。

答案 2 :(得分:0)

在java中,可以通过构造一个中间的BigDecimal对象将double从/转换为字符串:

double doubleValue = ...;

// From double to string
String valueOfDoubleAsString = new BigDecimal(doubleValue).toString();
// And back
double doubleValueFromString = new BigDecimal(valueOfDoubleAsString).doubleValue();

// doubleValue == doubleValueFromString

此方法没有区域设置问题。 但是,特殊的双值(无限,NaN)当然不起作用。