在我的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.我不知道为什么会发生这种情况.请有人解释为什么会发生这种情况以及纠正它的方法.
这是由于双打精度有限.
您的问题的根源是文字123.55
实际上代表了值123.54999...
.
如果你打印它可能看起来像它有价值123.55
:
System.out.println(123.55); // prints 123.55
Run Code Online (Sandbox Code Playgroud)
但实际上,印刷值是近似值.这可以通过创建一个BigDecimal
out(它提供任意精度)并打印BigDecimal来显示:
System.out.println(new BigDecimal(123.55)); // prints 123.54999999999999715...
Run Code Online (Sandbox Code Playgroud)
你可以通过经过来解决它,Math.round
但你必须知道源double实际需要多少小数,或者你可以选择通过double的字符串表示实际上通过一个相当复杂的算法.
如果你正在使用货币,我强烈建议你
BigDecimal
允许您0.1
准确地存储数字,或int
商店的分数(相对于拥有双重商店的数量).两种方式都完全可以接受并在实践中使用.
归档时间: |
|
查看次数: |
3459 次 |
最近记录: |