j6m*_*6m8 1 java math processing
我正在阅读Processing中的序列值.一个例子:
...
297.5
297.1
297.1
...
Run Code Online (Sandbox Code Playgroud)
这些数字的变化不会比这里显示的多得多.
然后,我运行以下代码:
if (val > 100) {
println(val);
}
Run Code Online (Sandbox Code Playgroud)
它打印的正是我上面写的.
然后我运行这段代码:
if (val > 100) {
val -= 230;
val *= 2;
println(val);
}
Run Code Online (Sandbox Code Playgroud)
它打印出截然不同的数字:
...
-189.59998
136.0
-188.0
135.0
-190.0
...
Run Code Online (Sandbox Code Playgroud)
认为某些事情与我的数学有关(但是如何?!),我把我的代码减少到了这个:
if (val > 100) {
val -= 230;
println(val);
}
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,它打印出67.
有什么问题val *= 2?!
我唯一能想到的是,我'溢出'为float数据类型分配的内存,所以它'滚动'为负...但这怎么可能?我认为Processing对Java来说只是一个薄薄的皮肤.
import processing.serial.*;
Serial s;
float val;
void setup() {
size(600, 400);
String portName = Serial.list()[1];
s = new Serial(this, portName, 9600);
s.bufferUntil('\n');
}
void draw() {
if ( s.available() > 0) {
try {
val = Float.parseFloat(s.readStringUntil('\n').trim());
}
catch (Exception e) {
}
if (val > 100) {
val -= 230;
val = val * 2.0;
println(val);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在以下网站粘贴了未删节版本的输出.第一个是没有算术的输出; 然后有一行###,然后执行算术后的值.
罪魁祸首是catch(Exception e){}.永远不要这样做.
抛出异常时,val它具有与之前相同的值.我猜你的输入流中有一些空白行或一些非法值.您的程序无法将这些解析为浮点数,抛出异常,然后继续向前.