【问题标题】:Value result is unintentionally rounding up?值结果无意四舍五入?
【发布时间】:2013-02-09 11:34:42
【问题描述】:

所以我编写了这段代码,基本上将简单的数学算术应用于变量。 rrdistance、qsdistance、heartrate 给出了理想的值,而 pamp 和 qamp 没有。我认为它圆了?假设在i = 1时,trial[1]的值为120,Pycoor[1]为102,Qycoor[1]为134。FINALBOXWIDTH(bitmap_Source)为10。

所以 pamp = ((120-102)/10) * 0.1 = 0.18 而 qamp = ((134-120)/10) * 0.1 = 0.14 的预期结果

我不明白为什么它们都显示 pamp = 0.1 和 qamp = 0.1。

static int[] Pxcoor = new int[50];
static int[] Pycoor = new int[50];
static int[] Qxcoor = new int[50];
static int[] Qycoor = new int[50];
static int[] Rxcoor = new int[50];
static int[] Rycoor = new int[50];
static int[] Sxcoor = new int[50];
static int[] Sycoor = new int[50];
static int[] Txcoor = new int[50];
static int[] Tycoor = new int[50];
    static int[] trial = new int[450];

public static int FINALBOXWIDTH(Bitmap src) {  ...
}

private void StratBackgroundProcess() {

if (i >= 2) {
  rrdistance += (((Rxcoor[i] - Rxcoor[i - 1]) / FINALBOXWIDTH(bitmap_Source)) * 0.04); 
  //durations in seconds
  printerval += (((Rxcoor[i] - Pxcoor[i]) / FINALBOXWIDTH(bitmap_Source)) * 0.04);
  qsdistance += (((Sxcoor[i] - Qxcoor[i]) / FINALBOXWIDTH(bitmap_Source)) * 0.04);
  heartrate += (1500 / (rrdistance / 0.04)); 

  //amplitude in mV
  pamp = (( (trial[1] - Pycoor[i]) / FINALBOXWIDTH(bitmap_Source))  * 0.1);
  qamp = (( (Qycoor[i] - trial[i]) / FINALBOXWIDTH(bitmap_Source)) *0.1);


    }
}

Pamp = pamp; Qamp = qamp;

coordinate.setText("" + pamp + "," + qamp + " ");

【问题讨论】:

  • 请提供此处显示的所有变量/参数的数据类型。
  • 这些变量是如何声明的?那里有一些整数,也许?
  • 我编辑代码,添加数据类型@CommonsWare
  • 这里没有显示任何内容的代码。
  • 这里仍然没有显示任何内容的代码。不是一个真正的问题。

标签: java android decimal


【解决方案1】:

问题几乎可以肯定是试验、Pycoor、Qycoor 和 FINALBOXWIDTH 项的声明。如果这些是整数(几乎可以肯定它们来自您的结果),那么:

((120-102)/10) * 0.1 = (18/10) * 0.1 = 1(注意整数数学向下舍入)* 0.1 = 0.1

现在,我实际上并不知道试用等中的值,因为您没有提供它们(不过,您已经提供了它们,并且它验证了我的工作),但是尝试将这两行更改为:

  pamp = (( (trial[1] - Pycoor[i]) / (double)FINALBOXWIDTH(bitmap_Source))  * 0.1);
  qamp = (( (Qycoor[i] - trial[i]) / (double)FINALBOXWIDTH(bitmap_Source)) *0.1); 

请注意,我只是将 FINALBOXWIDTH 强制为 double 类型,这将强制浮点运算。

请注意,您将获得双精度值,但并不总是能很好地显示。试试这个:

DecimalFormat df = new DecimalFormat("#.##");
System.out.println(df.format(pamp));
System.out.println(df.format(qamp));

【讨论】:

  • 我尝试了你的建议,但 qamp 显示的内容类似于 0.18000000000002 而 qamp 是 0.13999999999 @Bill James
  • 好吧,有错吗? trial[1]、Pycoor[1] 和 Qycoor[1] 的值是什么? FINALBOXWIDTH 调用的结果是什么?
  • 我能做些什么让它只有 0.18 和 0.14?
  • 没有错。我只想有2个小数位? 0.180000000002 看起来不太好。 :(
  • 如果 0.18 和 0.14 更符合您的预期,那没关系。您可以在 DISPLAY 时更改它们,而不是在变量中。您可以使用格式化程序之类的东西。我将编辑以上内容
【解决方案2】:

这可能与您使用的数据类型有关。
1. 确保计算中涉及的所有变量的数据类型是浮点数或双精度数(或任何其他能很好处理小数的数据类型,如 Decimal、BigDecimal 等)
2。每当在公式中使用浮点值时,都需要用 f 指定它们。所以你的公式应该是

pamp = (( (trial[1] - Pycoor[i]) / FINALBOXWIDTH(bitmap_Source))  * 0.1f);
qamp = (( (Qycoor[i] - trial[i]) / FINALBOXWIDTH(bitmap_Source)) *0.1f);

【讨论】:

  • 嗯,如果这是一个整数数学问题,“声明”0.1 为浮点数为时已晚,而且没有必要,因为它已经是一个浮点数了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
相关资源
最近更新 更多