在processing.org中舍入浮点数

时间:2012-12-07 14:36:08

标签: java floating-point processing

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

例如

float x = 1.0000001
float y = 1.1000000001

float a = x + y
round(a)

a = 2.10

标准round()处理轮次到最接近的整数,但我需要有小数位。我找不到能满足我要求的功能。我有一些超过一百个小数位的花车,所以如果可能的话,我需要将它们修剪下来。

3 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:1)

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

a = round(a * PowerOf10) * InversePowerOf10

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

a = round(a * 10) * .1

有一些警告和评论:

  • 这在二进制浮点中不起作用。这是不可能的,因为像.1这样的数字不能用二进制浮点精确表示。如果可能足够接近,取决于您的需求以及您是否采取适当的护理。
  • 十进制浮点数可能没问题,但十进制浮点数很少。如果处理实现十进制浮点,则可以全部设置。
  • 我对两个操作都使用了乘法,因为乘法通常比除法快。但是,在某些情况下使用除法可能更为可取:a = round(a * PowerOf10) / PowerOf10。 (值得注意的是,在二进制浮点数中,这可以避免在计算PowerOf10的逆时间时出现额外的舍入误差。)
  • 如果处理提供扩展精度二进制浮点,则结果可能足够接近您的目的,即使它不准确。
  • 如果要格式化数字以进行显示而不是进一步计算,请查找字符串格式化函数而不是数字舍入函数。即使在二进制浮点中,也可以将字符串中的数字转换为十进制数字。

答案 2 :(得分:0)

  

浮点数不精确,所以避免添加小值(例如0.0001)   由于舍入误差,可能不会总是递增。如果你想   以小间隔递增一个值,使用int,然后除以a   使用前浮动值。

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