减去数字的两倍和长

Jay*_*lya 1 java

在我的JAVA程序中有这样的代码:

int f_part = (int) ((f_num - num) * 100);
Run Code Online (Sandbox Code Playgroud)

f_num是double,num是long.我只想将小数部分取出并将其分配给f_part.但有时候f_part值比它的值小1.这意味着如果f_num = 123.55和num = 123,但f_part等于54.它只发生f_num而num大于100.我不知道为什么会发生这种情况.请有人解释为什么会发生这种情况以及纠正它的方法.

aio*_*obe 5

这是由于双打精度有限.

您的问题的根源是文字123.55实际上代表了值123.54999....

如果你打印它可能看起来像它有价值123.55:

System.out.println(123.55);                  // prints 123.55
Run Code Online (Sandbox Code Playgroud)

但实际上,印刷值是近似值.这可以通过创建一个BigDecimalout(它提供任意精度)并打印BigDecimal来显示:

System.out.println(new BigDecimal(123.55));  // prints 123.54999999999999715...
Run Code Online (Sandbox Code Playgroud)

你可以通过经过来解决它,Math.round但你必须知道源double实际需要多少小数,或者你可以选择通过double的字符串表示实际上通过一个相当复杂的算法.


如果你正在使用货币,我强烈建议你

  1. 让价格等表示BigDecimal允许您0.1准确地存储数字,或
  2. int商店的分数(相对于拥有双重商店的数量).

两种方式都完全可以接受并在实践中使用.