c - printf 中的尾数值略有偏差

标签 c printf mantissa

我对 C 语言完全陌生。试图在这里接机。希望你们能帮助我一点,如果我问了一些愚蠢的事情,请提前抱歉,但我真的找不到这个具体问题的任何答案。也很抱歉我的英语。

无论如何,下面是我的代码,对我来说工作正常。

#include <stdio.h>

int main(int argc, const char * argv[])
{


// float variable named "Crit_Dmg"
float Crit_Dmg;

// give "Crit_Dmg" a value
Crit_Dmg = 11.34;


// Log it to the user
printf("Critical Damage = %f.\n", Crit_Dmg);

// Declare Float variable named "Magic_Dmg"
float Magic_Dmg;

// Give Magic_Dmg a value
Magic_Dmg = 5.48;


// Show user
printf("Magical Damage = %f.\n", Magic_Dmg);

// Declare Double variable named "T_Dmg" (Total Dmg)
double T_Dmg;

// calculation of total damage (T_Dmg)
T_Dmg = Crit_Dmg + Magic_Dmg;

// show user Totas Dmg value
printf("Total Damage = %f.\n", T_Dmg);

// end
return 0;

}

printf结果显示

Critical Damage = 11.340000.
Magical Damage = 5.480000.
Total Damage = 16.820000.
Program ended with exit code: 0

但是当我将 Crit_Dmg 和 Magic_Dmg 值增加得更高时,根据我的输入,尾数不准确......

例如我改为

Crit_Dmg = 115.34;

Magic_Dmg = 515.48;

printf 看起来如下

Critical Damage = 115.339996.
Magical Damage = 515.479980.
Total Damage = 630.819946.
Program ended with exit code: 0

为什么尾数没有按照我的输入出现? 我该如何修复它?

最佳答案

正如其他人指出的那样, float 存储在基数 2 中,以最大程度地提高给定内存量存储的数字的精度,但并非所有基数 10 小数都具有基数 2 的精确表示,因此有时会出现舍入误差在基数 2 中,您不会在基数 10 中看到这种情况,尽管任意数字的整体精度比使用基数 10 更好。

最简单的解决方法是更明确地格式化输出:

printf("Critical Damage = %.2f.\n", Crit_Dmg);

关于c - printf 中的尾数值略有偏差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22590273/

相关文章:

c - 向前移动数组元素并插入新元素

c - printf 连续打印

c++ - printf 从整数转义 unicode 字符

objective-c - NSDecimalNumber 的小数部分

c - C 中整数的顺序颠倒

c - 如何使用 malloc.h header 为结构指针分配内存?

c - 为什么我的 C 应用程序没有生成 coredump

linux - printf 使用 in/bin/bash

c++ - 如何在特定机器上找到尾数长度?