0

有没有办法在处理过程中将浮点数四舍五入到最接近的小数位?

例如

float x = 1.0000001
float y = 1.1000000001

float a = x + y
round(a)

a = 2.10

round()处理四舍五入到最接近的整数的标准,但我需要有小数位。我找不到可以满足我要求的功能。我有一些小数点数超过一百位的浮点数,所以如果可能的话,我需要将它们修剪掉。

4

3 回答 3

2

这是一个更以处理为中心的函数:

float fixDec(float n, int d) {
  return Float.parseFloat(String.format("%." + d + "f", n));
}

并对其进行测试:

float x = 1.0000001;
float y = 1.1000000001;
x = fixDec(x, 2);
y = fixDec(y, 2);
float a = x + y;
round(a);

这可能不是最有效的算法,但它确实有效。

于 2012-12-11T07:11:41.743 回答
1

我不熟悉处理。但是,在给定整数舍入函数的情况下,舍入到固定小数位数的常用方法是:

a = round(a * PowerOf10) * InversePowerOf10

因此,对于小数点后的一位数,您可以使用:

a = round(a * 10) * .1

有一些注意事项和评论:

  • 这在二进制浮点中不起作用。这是不可能的,因为像 .1 这样的数字不能用二进制浮点数精确表示。如果可能足够接近,取决于您的需要以及您是否采取适当的措施。
  • 十进制浮点可能很好,但十进制浮点很少见。如果处理实现了十进制浮点,你可能已经准备好了。
  • 我对这两种运算都使用了乘法,因为乘法通常比除法快。但是,在某些情况下最好使用除法:a = round(a * PowerOf10) / PowerOf10. (值得注意的是,在二进制浮点中,这避免了计算 PowerOf10 的倒数时的额外舍入误差。)
  • 如果处理提供了扩展精度的二进制浮点,即使结果不准确,结果也可能足够接近您的目的。
  • 如果要格式化数字以进行显示而不是进一步计算,请寻找字符串格式化函数而不是数字舍入函数。即使在二进制浮点中,也可以将字符串中的数字转换为十进制数字。
于 2012-12-07T22:09:08.490 回答
0

浮点数并不精确,因此避免添加较小的值(例如 0.0001)可能不会因为舍入误差而始终递增。如果要以小间隔递增值,请使用 int,并在使用前除以 float 值。

http://processing.org/reference/float.html

int i = 10001000;
int j = 11000001;

float a = round((i + j)/pow(10,5));

a /= 100;

println(a);

2.1

于 2012-12-08T03:08:35.570 回答