java中的舍入双[重复]

Posted

技术标签:

【中文标题】java中的舍入双[重复]【英文标题】:rounding double in java [duplicate] 【发布时间】:2013-06-06 17:25:12 【问题描述】:

我有一个存储在文本文件中的双值对角矩阵。

size(file)~410 Mo

我想通过舍入我的双精度值来减小大小。

如果它是一个好主意,如何在java中做到这一点

0.1706524958886193=>0.17

我需要稍后在matlab中使用这个文件

当我尝试时

dlmread(file) 我内存不足错误

【问题讨论】:

您是将此文件存储为文本还是直接二进制文件? 作为文件文本(.txt)//我需要稍后在matlab程序中使用它 只需使用例如printf 根据需要进行格式化。 查看DecimalFormat 类来格式化你的双打。 @eternay 他想要四舍五入 【参考方案1】:

如果对值进行四舍五入,则会丢弃精度。这可能会改变您将获得的结果。

更好的方法是只存储对角线项目。存储 n^2-n 个非对角线零是没有意义的。使用 diag 函数将向量转换为对角矩阵。 http://www.mathworks.es/es/help/matlab/ref/diag.html

更高效:以二进制格式而不是文本存储数字。

【讨论】:

+1 因为我同意减少到 2 位小数可能会改变结果。 好主意,但是 .... 函数 diag =out of memory 也有同样的问题 那么矩阵太大了,无法使用当前分配给 Matlab 的内存进行处理。这里有一个关于如何为 Matlab 提供更多内存和如何减少内存消耗的提示的页面:mathworks.es/es/help/matlab/matlab_prog/… 是的,谢谢,我问过这个问题here:【参考方案2】:

使用DecimalFormat 类根据您的需要格式化double 值。例如,如果您只想保留小数点后 2 位使用,"#0.00 等等。 DecimalFormat#format 类返回 String 输出,您可以使用它来实例化 Double 值。 来自

import java.text.DecimalFormat;
public class Tester

  public static void main(String arg[]) throws Throwable
  
    double bigDouble=0.1706524958886193;
    DecimalFormat df=new DecimalFormat("#0.00");
    String numberString=df.format(bigDouble);
    double smallDouble=new Double(numberString);
    System.out.println(smallDouble);
  

希望这会有所帮助...

【讨论】:

+1 因为它是整数的最佳解决方案。 +1 请在NumberFormat中添加实现的方法,否则必须使用BigDecimal true is@EJP @mKorbel 请添加?我没听懂你……你想让我编辑我的答案还是? 不是我的链接答案中没有任何内容,也没有编辑某些内容,您对我的 cmets 有任何问题吗?【参考方案3】:

除非我误解了这个问题,否则你可以这样做:

double value = 0.1706524958886193;
value = (double)((int)(value*100))/100; // returns 0.17

【讨论】:

那将是截断。提问者似乎想要四舍五入 另外,在大多数情况下,这不会产生“准确”的结果...

以上是关于java中的舍入双[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何舍入双精度值但保持尾随零

openjdk8中的舍入问题

mysql 中的舍入不能按预期工作

如何处理 Shapely 中的舍入误差

有没有办法防止opencv矩阵除法中的舍入

c集成程序中的舍入错误