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