我正在尝试编写一个程序来计算直到明年的秒/分钟,但我已经发现了一些非常奇怪的东西,我无法弄清楚它在做什么。这是我的代码:
import java.util.Calendar;
import java.util.GregorianCalendar;
Calendar currentTime;
Calendar newYear;
int nextYear;
void setup() {
size(500, 250);
frameRate(60);
}
void draw() {
background(255, 0, 0);
currentTime = Calendar.getInstance();
nextYear = currentTime.get(Calendar.YEAR) + 1;
newYear = new GregorianCalendar(nextYear, 1, 1, 0, 0, 0);
textAlign(CENTER, CENTER);
fill(0);
textSize(20);
long timeInMillis = currentTime.getTimeInMillis(); //I added this to try to fix it.
System.out.println(timeInMillis); //Used to be System.out.println(currentTime.getTimeInMillis())
text(timeInMillis, width/2, height/2); //Used to be text(currentTime.getTimeInMillis(), width/2, height/2)
}
我甚至尝试在当前的毫秒时间内创建一个实际的局部变量,但它没有做任何事情。问题在于:尽管我将相同的内容放入System.out.println()
和text()
,但窗口中显示的数字始终保持不变。它也将其格式化为十进制,即使它是一个很长的值。当我运行程序时,文本是:
1448569995264.000
然而,输出的(最后五行)是:
1448570028853
1448570028869
1448570028886
1448570028903
1448570028919
文字根本不会改变,我无法弄清楚原因。
答案 0 :(得分:1)
text()
函数不是为处理long
变量而设计的。它仅用于处理String
,int
和float
个变量。因此,text()
功能会将您的long
视为float
。这就是你获得小数位的原因。
这也是为什么数字不能改变 - float
值只能处理一定数量的有效数字,因此它们会失去准确性,因为它们具有非常大的值,例如您所使用的值。重新使用。作为旁注,这个问题也可能导致像这样的奇怪案例:
float x = 123456789;
println(x == x+1); //prints true!
解决方案是不将long
值与处理函数混合。如果您需要创建String
值以传递到text()
函数,请手动执行此操作。最简单的方法可能是String.valueOf()
函数:
text(String.valueOf(timeInMillis), width/2, height/2);
还有其他功能可用于更具体的格式化,但这将为您提供基础知识。