如何将字符串转换为浮点数?

abu*_*ker 48 c floating-point type-conversion atof strtod

#include<stdio.h>
#include<string.h>

int main() 
{
    char s[100] ="4.0800" ; 

    printf("float value : %4.8f\n" ,(float) atoll(s)); 
    return 0; 
}
Run Code Online (Sandbox Code Playgroud)

我希望输出应该是4.08000000我得到的4.00000000.

有没有办法得到点后的数字?

Mys*_*ial 57

使用atof()strtof()*代替:

printf("float value : %4.8f\n" ,atof(s)); 
printf("float value : %4.8f\n" ,strtof(s, NULL)); 
Run Code Online (Sandbox Code Playgroud)

http://www.cplusplus.com/reference/clibrary/cstdlib/atof/
http://www.cplusplus.com/reference/cstdlib/strtof/

  • atoll() 是整数.
  • atof()/ strtof()是浮动.

之所以你只有4.00atoll()是因为当它发现的第一个非数字将停止解析.

*注意,strtof()需要C99或C++ 11.

  • @Mysticial 哦,对了,所有的短浮点函数都是 C99。但是 `strtod` 在 C89 中并且与 `atof` 具有相同的优势(明确报告解析错误)。 (2认同)

sam*_*var 28

不幸的是,没有办法轻易做到这一点.每种解决方案都有其缺点.

  1. 使用atof()strtof()直接:这是大多数人会告诉你的事情,它大部分时间都可以使用.但是,如果程序设置了区域设置或者它使用了设置区域设置的库(例如,显示本地化菜单的图形库),并且用户将其区域设置设置为小数分隔符不在的语言.(例如fr_FR,分隔符是,)这些函数将停止解析,.你将得到4.0.

  2. 使用atof()strtof()改变语言环境; 这是setlocale(LC_ALL|~LC_NUMERIC, "");在打电话atof()或喜欢之前打电话的问题.问题setlocale在于它将是整个流程的全局,您可能会干扰程序的其余部分.请注意,您可以查询当前区域设置,setlocale()并在完成后将其恢复.

  3. 编写自己的浮点解析例程.如果您不需要高级功能(如指数解析或十六进制浮点数),这可能会非常快.

另请注意,该值4.08不能完全表示为float; 你会得到的实际价值是4.0799999237060546875.

  • +1用于指出读取浮动的区域设置问题. (5认同)

use*_*087 18

为什么不应该使用函数atof()将字符串转换为double?

成功时,atof()函数将转换后的浮点数作为double值返回.如果无法执行有效转换,则函数返回零(0.0).如果转换后的值超出可表示值的范围,则会导致未定义的行为.

参考:http://www.cplusplus.com/reference/cstdlib/atof/

而是使用函数strtod(),它更健壮.

试试这段代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    char s[100] = "4.0800";
    printf("Float value : %4.8f\n",strtod(s,NULL));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

您将获得以下输出:

Float value : 4.08000000


Luc*_*ore 5

使用atof()

但这已被弃用,请使用它:

const char* flt = "4.0800";
float f;
sscanf(flt, "%f", &f);
Run Code Online (Sandbox Code Playgroud)

http://www.cplusplus.com/reference/clibrary/cstdlib/atof/

atof()0失败和转换时都会返回0.0,最好不要使用它。

  • 建议改为“sscanf()”也好不到哪去。我建议改为“strtod()”。 (2认同)