乘以两个浮点数并不能得到确切的结果

ugu*_*gur 1 c floating-point

我试图将两个floats 乘以如下:

float number1 = 321.12;
float number2 = 345.34;
float rexsult = number1 * number2;
Run Code Online (Sandbox Code Playgroud)

我想看到的结果是110895.582,但是当我运行代码时它只给了我110896.大部分时间我都有这个问题.任何计算器都会给出包含所有小数的精确结果.我怎样才能获得这个结果?

编辑:这是C代码.我正在使用XCode iOS模拟器.

Die*_*Epp 11

还有很多四舍五入.

float a = 321.12; // this number will be rounded
float b = 345.34; // this number will also be rounded
float r = a * b;  // and this number will be rounded too
printf("%.15f\n", r);
Run Code Online (Sandbox Code Playgroud)

经过三次单独的舍入后,我得到了110895.578125000000000.

  1. 如果你想要超过6位十进制数字的精确度,你将不得不使用double而不是float.(请注意,我说"十进制数字值",因为你没有得到十进制数字,你得到二进制数.)就目前而言,1/2 ULP的错误(最坏情况下的一个完美的舍入结果)是关于0.004.

  2. 如果您想要精确舍入的十进制数,则必须使用专用的十进制库来执行此类任务.A double对于科学家而言具有足够的精确度,但如果你使用金钱,一切都必须100%准确.没有浮点数的钱.

与整数不同,浮点数在您习惯于陷入陷阱之前需要一些实际的工作.请参阅" 每个计算机科学家应该知道的关于浮点算术的内容 ",这是该主题的经典介绍.

编辑:实际上,我不确定代码会轮三次.它可能会循环五次,因为常量为ab可能首先舍入为双精度,然后在存储时为单精度.但我不太清楚这部分C的规则.