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

时间:2011-09-07 11:53:21

标签: c qt

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

double val = strtod(str, &endptr);

为了解释这个问题,我将举例说明strtod被调用后的值。

str = "-0.021344"
val = -0
*endptr = '.'

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

感谢您的想法。

3 个答案:

答案 0 :(得分:7)

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

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

char *saved_locale;
saved_locale = setlocale(LC_NUMERIC, "C");
/* do your strtod thing */
setlocale(LC_NUMERIC, saved_locale);

答案 1 :(得分:4)

所有使用文本表示的C函数都受区域设置的影响。

您的语言区域是什么?在某些情况下,小数点实际上是,

答案 2 :(得分:1)

小数点取决于区域设置。

  

来自the manual

     

十进制数由一个非空的十进制数字序列组成,可能包含一个基数字符(小数点,依赖于语言环境,通常是''。''),可选地后跟一个十进制指数。十进制指数由''E''或''e''组成,后跟可选的加号或减号,后跟非空的十进制数字序列,并表示乘以10的幂。