【问题标题】:convert char * to double,without losing precision in c将 char * 转换为 double,而不会丢失 c 中的精度
【发布时间】:2016-06-01 08:08:29
【问题描述】:

我需要一些帮助。我必须将 char * 转换并存储为 double 或 long double 而不会丢失精度。

确实,我尝试使用 strtoldatof 方法(也有 strtold),但这些方法是对值进行四舍五入。

例如:

char * key  ="39.7519707";

double ld =strtod((char*)key,NULL);

printf("%lf", ld);

打印:39.751971

printf("%6.7f",ld) 给了我正确的值,但我无法存储到变量中。

【问题讨论】:

  • but I couldn't store into a variable....那是什么?
  • 我需要将其转换并存储为双精度..
  • 使用"%f" 在显示有效数字方面存在问题。要打印 FP 值并查看其有效数字,请参阅 stackoverflow.com/q/16839658/2410359
  • 不丢失精度是不可能的,因为double 通常只有有限的位数。

标签: c char strtod


【解决方案1】:

首先,您只需要%f 格式说明符即可打印double

那么,使用strtod() 并不会丢失精度,输出表示是你如何使用printf()%f 格式说明符的问题。

根据C11,第 7.21.6.1 章,fprintf()

[...] 如果 缺少精度,取为 6;[...]

接下来,当你这样做时

printf("%6.7f",ld);

精度变为 7 并输出您希望看到的值。

【讨论】:

  • 首先感谢您的回答。哦,好吧...所以我能理解的是 strtod() 给了我正确的值,但我没有正确打印它,对吧?
  • @kuttyV 差不多了。
  • @kuttyV strtod() 可能不会给出 exactly 正确的值,因为大多数系统使用二进制浮点,而不是十进制,但它会尽可能接近。
  • @IanAbbott :哦,那你认为我可以用什么来代替 strtod() ?
  • @kuttyV 这不是strtod 问题所在。根本无法将大多数小数准确表示为具有有限位数的二进制分数。这与无法将 1/3 精确地表示为具有有限位数的小数是相同的问题。
猜你喜欢
  • 2010-10-29
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 2012-10-26
  • 2023-03-18
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
相关资源
最近更新 更多