Java - 具有有限小数位但没有昏迷的浮点数

时间:2013-05-02 13:23:57

标签: java decimal

我正在为我的计算机科学课程开发一个图形计算应用程序。我正在做很多关于向量的计算,但有时我会得到一些严重的截断,因为它是浮点数算术。

问题是我尝试了一些方法来限制浮点数的小数位,例如2个位置。以下是我尝试的一些事情:

1 - 除以并乘以100.这不会一直有效。实际上这对我不起作用。

2 - 使用DecimalFormat。如果我有1000以下的数字,这种格式化方法很有效。当我有1003.3124这样的数字时,它格式化为1,003.31。由于此格式化返回String,因此浮点的解析函数因昏迷而无效。我试图将DecimalFormatSymbols()setGroupingSeparator设置为不同的字符,包括no空格和no lenght char('\ u0200B','\ u0000',...),但我得到'?'而不是所需的字符。

3 - 将“区域设置”设置为“美国”。由于我的Windows以Brazillian葡萄牙语运行(这里的点和昏迷有不同的文件:你的1,300.42是我们的1.300,42!)我认为这是愚蠢的,但这不是问题。这也解决了。

4 - 取出字符串,删除逗号并返回Float编号。这就是我现在正在做的,它正常工作。但是,因为它是一个图形应用程序,所以我一直用数字进行标准化。所以String解决方案总是太重了。

那你知道解决这个问题的另一种方法吗?我需要最优化的一个。对不起,如果我不清楚。

3 个答案:

答案 0 :(得分:0)

我建议您只使用float进行计算,如果要在点/昏迷之后显示正好2位数的数字,请使用String.format

尝试在RAM中进行优化计算可能不是一个好主意,因为浮点数已经是Java和硬件极其优化的原始类型。

答案 1 :(得分:0)

目前尚不清楚您是在处理显示问题还是内部存储/计算。如果是后者,请阅读BigDecimal

如果您的问题只是显示,请使用适当的DecimalFormat。我完全不明白你的意思“因为这个格式化返回一个字符串,Floats的解析函数不起作用”,你为什么要解析它?

答案 2 :(得分:0)

这个问题的一个解决方案可能是在乘以100后将浮动转换为整数,然后在执行此操作后将其转换为浮点数。示例:

float x = 20;
float y = (float)Math.PI;
float total = (float)(int)((x+y)*100)/100;

我不确定这种方法在记忆方面的效果如何,或者速度明智,但它肯定是一种方法。