值结果意外四舍五入了吗?

3
我有这段代码,基本上是将简单的数学算术应用于变量。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;

将pamp的值赋给Pamp,将qamp的值赋给Qamp。

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

在坐标文本框中显示Pamp和Qamp的值,以逗号分隔。


请提供此处显示的所有变量/参数的数据类型。 - CommonsWare
这些变量是如何声明的?里面有一些整数吗? - 323go
我编辑了代码,添加了数据类型@CommonsWare。 - cookie23
这里没有任何显示内容的代码。 - user207421
这里仍然没有任何显示内容的代码。不是一个真正的问题。 - user207421
2个回答

3
问题很可能出在试验、Pycoor、Qycoor和FINALBOXWIDTH项目的声明上。如果这些是整数(从您的结果来看,它们几乎肯定是整数),那么:
((120-102)/10) * 0.1 = (18/10) * 0.1 = 1(注意,整数除法向下取整) * 0.1 = 0.1
现在,我实际上不知道trial等值的具体数值,因为您没有提供它们(尽管您现在已经提供了它们,并验证了我的工作),但请尝试将这两行更改为:
  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 - cookie23
@cookie23 记得你可以随时查看文档以了解更多信息!http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html 和 http://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html - ajp15243
我添加了一个 DecimalFormat 示例,以打印四舍五入到小数点后两位的 pamp 和 qamp。只需重新加载页面即可。 - billjamesdev
我不知道该用什么哈哈哈! - cookie23
我把print改成了println,这样你就可以在输出中看到每个值都在单独的一行上,但在你描述出现了什么问题之前,很难知道问题出在哪里。 - billjamesdev
显示剩余9条评论

-1
这可能是由于您使用的数据类型不正确。
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“声明”为浮点数已经太晚了,并且也没有必要,因为它已经是一个浮点数。 - billjamesdev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接