此问题涉及C / x86上使用的IEEE标准浮点数。
是否可以将任何数字(即排除特殊值,如NaN)浮点数或双精度表示为十进制字符串,以便将该字符串转换回浮点数/双精度数将始终完全生成原始数字?
如果没有,什么算法告诉我给定的数字是否会出现转换错误?
如果是这样,请考虑这一点:当转换为二进制时,一些小数部分在数值上不会与原始十进制值相同,但反之则不正确(因为二进制具有有界精度,因此任何十进制扩展都是有限的,完美如果没有被截断),所以这是另一个问题...
是否有必要在十进制表示中引入故意错误,以便欺骗atof
(或其他)函数产生确切的原始数字,或者是一个天真的,非截断的toString
功能是否足够(假设一般可以进行精确转换)?
答案 0 :(得分:7)
根据this page:
实际上,IEEE754-1985标准规定17位小数是 足够在所有情况下。但是,似乎标准有点 关于合规实施是否必须保证无损的含糊不清 使用17位数时的转换。
因此,将double
作为十进制字符串存储至少17位数(正确舍入)将保证它可以转换回二进制double
而不会丢失任何数据。
换句话说,如果要将每个可能的双精度值转换为17位数的十进制字符串(正确舍入),它们将全部映射到不同的值。因此没有数据丢失。
我不确定单精度的最小截止值。但我怀疑它会是8位或9位数。
答案 1 :(得分:0)
鉴于IEEE格式只能表示有限数量的(二进制)数字,因此具有最小精度(参见epsilon),您只需要有限数量的(十进制)数字。当然,如果实现(strtod
,snprintf
)在{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)当然不起作用。