4

我的输出是这样的 -红宝石 - 乘法问题

ruby-1.9.2-p290 :011 > 2.32 * 3 
=> 6.959999999999999 

我记得某个时候回到另一台机器上我已经得到它像.. 2.32 * 3 = 6

什么是我的错? 非常感谢您阅读本文。 :)

+0

上一个必须被截断为整数。 – tvanfosson

+0

不客气。 '2.32.to_i * 3 => 6' – maletor

回答

7

如果你真的想向下舍为整数,然后只

(3 * 2.32).to_i 

,但我认为这是不可能的。通常你只是想稍微不精确的浮点数字格式是这样的

"%0.2f" % (3 * 2.32) 
=> "6.96" 

如果你真的想与精确表示上班,那么你可以使用BigDecimal

require 'BigDecimal' 
(3 * BigDecimal.new("2.32")).to_s("F") 
=> "6.96" 

PS。推荐阅读http://floating-point-gui.de/ DS。

+0

非常感谢!这将打印真实的东西。但我真正的问题是不同的,虽然...我想将浮点数精确到两位数并将其存储在数据库中。但是它()不适用于2.33333333。 – Anuprit

+0

它以什么方式不起作用? '2.333333333333.round(2)''=> 2.33' –

+0

我弄明白了。经过四舍五入后,我减去0.01,这再次给我浮动不准确的数字为2.3200000000000004。所以现在我在减法后再次四舍五入。 – Anuprit

4

我不能告诉你关于Ruby的信息,所以请原谅我。但坦率地说原则保持不变,所以我希望会有所帮助:

Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 2.32 * 3 
6.959999999999999 

正如你所看到的,Python做相同。

System.out.println(2.32 * 3); 
6.959999999999999 

的Java做同样的!那么它有什么问题?

让我们尝试移动到BigDecimal S:

System.out.println(new BigDecimal(2.32)); 
2.319999999999999840127884453977458178997039794921875 

你在这里看到什么实际上2.32意思。这只是在大多数情况下,printtoString(),或者任何您的语言用于将浮点数转换为字符串的值,这些数字会稍微增加一点。

不精确值,由于这一事实,即浮事实上二进制表示的实数,而不是那些十进制 - 这,反过来,使这些二进制重复,或复发。而且,正如你所猜测的,在有限的空间中重复真实并不是确切的。正确的措辞是,“这是最接近的小数的Java可以得到近似的2.32实际值” -

其实,当我说的吓人小数上面是什么意思2.32我在撒谎。

更多在这里阅读:http://floating-point-gui.de/

+0

哦!我明白了。我一直忘记基础知识!我明白你说什么时,数字转换为字符串的问题是可见的。但我想我也可以在数据库中看到相同的值。让我验证一下。谢谢。 – Anuprit