将int转换为双精度小数点

时间:2014-12-11 18:06:15

标签: ios xcode

在调试窗口中,当我输入以下命令时: po 1912 / 10.0

输出为191.19999999999999

我真正希望得到的是191.2

为什么会发生这种情况,如何将int转换为精确的双精度?

3 个答案:

答案 0 :(得分:1)

来自What Every Programmer Should Know About Floating-Point Arithmetic

  

为什么我的数字,如0.1 + 0.2加起来不是很好的一轮0.3,而是我得到一个奇怪的结果,如0.30000000000000004?

     

因为在内部,计算机使用的格式(二进制浮点)无法准确表示0.1,0.2或0.3之类的数字。

     

编译或解释代码时,“0.1”已经四舍五入到该格式的最接近数字,即使在计算发生之前也会导致小的舍入误差。

这就是程序员说你应该只把钱存成整数的原因。例如int cents = 1995;而不是float dollars = 19.95

如果你的应用不需要100%精确(例如,如果你正在计算屏幕坐标或半透明度或颜色),只需将你的浮点格式化为1或2位小数:

double someValue = 1912/10.0;
NSLog(@"2 decimals: %.2f", someValue);
NSLog(@"0 decimals: %.0f", someValue);

此代码将输出:

  

2位小数:191.20
  0位小数:191

答案 1 :(得分:0)

浮点数的正常情况。 Double显然只是一个扩展的精度浮点数。如果你想保留原始的十进制数字,那么不允许任何浮点/双转换。而是将结果存储为缩放的整数(在您的情况下为1912)并手动放置小数。

答案 2 :(得分:0)

让我试着用另一种方式来解释。当用带浮点数或双精度的小数部分表示数字时,精度最常丢失。没有办法解决这个问题。如果将1912存储为浮点数并将10存储为浮点数,则将第一个存储值除以秒,该值将永远不会为191.2。这就是浮点数的工作方式。如果你查看调试器中的数字,你会看到如你所描述的191.19999999999999之类的内容。这本身就是一个近似值,因为该值应该是191.19999999999999 ...但是当然,当数字的位数接近无穷大时,您甚至无法输入该存储结果的十进制值中的所有数字。

如果你要使用浮点数,那就是你得到的东西。没办法。

如果你真的想获得191.2,那么你就不能使用浮点数,至少不进行舍入。相反,您需要通过将值存储为1912并将值以小数点打印到2的左侧来对数字进行标准化。

http://floating-point-gui.de/basic/

还有另一个简短的在线说明