strtod在Qt项目中使用时截断小数

Nob*_*ody 3 c qt

我目前正在调试有时可行的代码,有时却没有.它是一个OBJ文件加载器,我找到了产生问题的部分:

double val = strtod(str, &endptr);
Run Code Online (Sandbox Code Playgroud)

为了解释这个问题,我将给你一个strtod调用后的值的例子.

str = "-0.021344"
val = -0
*endptr = '.'
Run Code Online (Sandbox Code Playgroud)

在该行后面进行错误检查并且如果*endptr != '\0'抛出错误.现在当然会抛出错误,因为strtod将点标记为数字的结尾,但为什么会这样呢?另请注意,在QT项目中使用代码时,我只遇到此错误.

谢谢你的想法.

pmg*_*pmg 7

也许你正在使用小数点不是的语言环境..setlocale(LC_NUMERIC, "C");strtod声明之前尝试.

注意:我不知道语言环境和QT如何表现在一起.您可能希望保存并恢复区域设置...

char *saved_locale;
saved_locale = setlocale(LC_NUMERIC, "C");
/* do your strtod thing */
setlocale(LC_NUMERIC, saved_locale);
Run Code Online (Sandbox Code Playgroud)

  • 这样做的Qt方式是:`QLocale :: setDefault(QLocale :: C);`.当然,这相当于`LC_ALL`. (2认同)
  • 需要将许多区域设置类别(绝对"LC_CTYPE")设置为用户首选的区域设置以获得正确的程序行为.但是`LC_NUMERIC`纯粹是有害的,应该总是设置为"C".数学/数字不是文化习俗.他们是数学.每个人都知道数学是绝对的.:-)无论如何,关键是不要只把它全部设置为C; 相反,修改`LC_NUMERIC`为C. (2认同)