缩短 double 值 x 位
Shorten double value x digit
我有一个双精度值,我想将其缩短为整数部分后的 6 位数字。例如:
double aDouble = 418.73684210526318;
double convertedDouble = conversion (aDouble);
convertedDouble 必须是 418.736842
我实施了这个解决方案:
convertedDouble = floor(aDouble * 1000000) / 1000000;
但是,convertedDouble 是 418.73684200000002,而不是 418.73684200000000
我能做什么?
你应该区分双精度数(64 位,大约 17 位小数)的内部表示和这样的 字符串表示 double 用于在打印输出、GUI 等中显示值
通常改变内部表示是没有意义的,即 double 的实际值,但使用 "print format" 来创建具有所需小数位数(和舍入)的字符串表示
您在评论中提到的决策树问题的最简单解决方案是考虑应该转到树的特定分支的双打范围,而不是单个双打。
但是,这里尝试使用您要求的转换功能:
double conversion(double in){
char wkStr[1000];
snprintf(wkStr, sizeof(wkStr), "%.6f", in);
double result;
sscanf(wkStr, "%lf", &result);
return result;
}
如您所见,找到最接近将给定双精度四舍五入到有限小数位数的结果的双精度并不是一个微不足道的问题。它可以被视为两个不平凡但已经解决的问题的组合:
- 将输入的双精度格式设置为四舍五入到所需小数位数的十进制字符串。
- 解析该字符串以获得最接近四舍五入的十进制值的双精度值。
我有一个双精度值,我想将其缩短为整数部分后的 6 位数字。例如:
double aDouble = 418.73684210526318;
double convertedDouble = conversion (aDouble);
convertedDouble 必须是 418.736842
我实施了这个解决方案:
convertedDouble = floor(aDouble * 1000000) / 1000000;
但是,convertedDouble 是 418.73684200000002,而不是 418.73684200000000
我能做什么?
你应该区分双精度数(64 位,大约 17 位小数)的内部表示和这样的 字符串表示 double 用于在打印输出、GUI 等中显示值
通常改变内部表示是没有意义的,即 double 的实际值,但使用 "print format" 来创建具有所需小数位数(和舍入)的字符串表示
您在评论中提到的决策树问题的最简单解决方案是考虑应该转到树的特定分支的双打范围,而不是单个双打。
但是,这里尝试使用您要求的转换功能:
double conversion(double in){
char wkStr[1000];
snprintf(wkStr, sizeof(wkStr), "%.6f", in);
double result;
sscanf(wkStr, "%lf", &result);
return result;
}
如您所见,找到最接近将给定双精度四舍五入到有限小数位数的结果的双精度并不是一个微不足道的问题。它可以被视为两个不平凡但已经解决的问题的组合:
- 将输入的双精度格式设置为四舍五入到所需小数位数的十进制字符串。
- 解析该字符串以获得最接近四舍五入的十进制值的双精度值。