【问题标题】:C++ atof/_wtof, rounding errorC++ atof/_wtof,舍入错误
【发布时间】:2017-02-09 13:38:26
【问题描述】:

我有一个 CString 变量,我需要将其转换为双精度变量

CString sVal(_T("    4.2"));
double dbl2 = _wtof(sVal);

我得到 dbl2 = 4.0000 而不是 4.2。四舍五入的原因可能是什么?

【问题讨论】:

  • 你能否展示一个完整的主程序,包括这个示例(并首先检查它是否显示问题)。理想情况下,您应该将其转换为使用标准 std::wstring,但如果不是,我会更改标签以包含特定于 MS 的内容。
  • 您在欧洲大陆吗? (换句话说,您的机器是否设置了小数点分隔符,?)它可能正在执行特定于语言环境的转换。
  • 俄罗斯,setlocale(LC_ALL, ".1251");你是对的,替换“。”到“,”消除了问题
  • 抱歉,俄罗斯确实是“欧洲大陆”,但我不知道你用什么小数分隔符。
  • "替换 '.'到 ',' 消除了问题” - 不,它没有。它只是用另一个问题代替了它。如果你在美国英语系统上运行它,你又要解决一个错误。

标签: c++ mfc rounding c-strings atof


【解决方案1】:

小数点是本地化中的“项目”之一

警告!!!以下代码未针对许多后续转换进行优化

#include <locale.h> 
#include <string>

...

CString sVal(_T("    4.2"));

std::string currentLocale = setlocale(LC_NUMERIC, NULL); //retrive current locale
setlocale(LC_NUMERIC, "C"); //change numeric locale to C, now decimal separator is '.'

double dbl2 = _wtof(sVal);

setlocale(LC_NUMERIC, currentLocale.c_str()); //return to original locale

http://www.cplusplus.com/reference/clocale/setlocale/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多