Java 双重铸造不能产生预期的价值
我试着用一个值很小的双精度来制作一个更规则的尺寸。例如,除以1/(双精度)将产生类似于14.12848572….的结果。。。。然后我将这个双精度转换成一个整数,生成一个数字,我可以用它在JPanel中绘制一个图像 我一直面临的问题是,图像并没有按照我期望的方式绘制。我想这是因为我不明白双打的工作原理。任何人如果能告诉我这个过程是如何进行的,都会非常有帮助 编辑:Java 双重铸造不能产生预期的价值,java,swing,casting,double,paint,Java,Swing,Casting,Double,Paint,我试着用一个值很小的双精度来制作一个更规则的尺寸。例如,除以1/(双精度)将产生类似于14.12848572….的结果。。。。然后我将这个双精度转换成一个整数,生成一个数字,我可以用它在JPanel中绘制一个图像 我一直面临的问题是,图像并没有按照我期望的方式绘制。我想这是因为我不明白双打的工作原理。任何人如果能告诉我这个过程是如何进行的,都会非常有帮助 编辑: 此代码的目的是将货币值转换为图形上条形图的大小。这些条的大小应随着值的变化而变化,以便以最有效的方式利用空间 因此 由于货币价值的性
此代码的目的是将货币值转换为图形上条形图的大小。这些条的大小应随着值的变化而变化,以便以最有效的方式利用空间 因此
- 由于货币价值的性质,max永远不会小于430
- 我希望图像越大,xscale越小。如果要绘制的值较少,则xscale越小,然后绘制的条形图越大
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.Timer;
公共类castingexample扩展了JPanel
{
私有静态内点;
私人静态内部高度;
私人静态色彩;
专用静态整型条=10;
私有静态int-xpoint=0;
私有静态int-barwidth=7;
专用静态双xscale=7;
专用静态int yscaleplus=10000;
私有静态int yscaleneg=0;
公共静态void main(字符串[]args)
{
JFrame=新JFrame();
frame.add(新的castingexample());
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架。设置尺寸(500500);
}
公共casting示例()
{
新计时器(100,新ActionListener()
{
@凌驾
已执行的公共无效操作(操作事件e)
{
调整大小();
重新油漆();
}
}).start();
}
public void resize()
{
xscale=钢筋/(800-钢筋*5);
xscale=1/xscale;
}
公共组件(图形g)
{
超级组件(g);
对于(int i=0;i
}
以下是一些相关代码:
public void resize()
{
int max = 0;
int min = 0;
for (int i = 0; i < bars; i++)
{
if (getTime(i) > max)
max = (int)getTime(i);
}
yscaleplus = max/430;
/*
for (int i = (int)(getLife() - getRetire() + 1); i < bars; i++)
{
if (getTime(i) < min)
min = (int)getTime(i);
}
yscaleneg = Math.abs(min/200);
*/
xscale = bars/(800 - bars*5);
xscale = 1/xscale;
}
public void paintComponent (Graphics g)
{
super.paintComponent(g);
g.drawLine(100, 20, 100, 630);
g.drawLine(100, 450, 900, 450);
for (int i = 0; i < bars; i++)
{
barheight = (int) (getTime(i)/yscaleplus);
barwidth = (int) (xscale);
ypoint = 450 - barheight;
xpoint = 105+(barwidth + 5)*i;
if(ypoint < 450)
color = Color.green;
else
color = Color.red;
g.setColor(color);
g.fillRect(xpoint, ypoint, barwidth, barheight);
}
}
public void resize()
{
int max=0;
int min=0;
对于(int i=0;i最大值)
max=(int)getTime(i);
}
yscaleplus=最大值/430;
/*
对于(inti=(int)(getLife()-getRetire()+1);i
double并不像您想象的那样存储信息,它们将信息存储为一个值,后跟一个2^x的指数值,这将删除您试图使用的功能
查看
Math.round(x)
。1)要更快获得更好的帮助,请发布一个。2) 获取示例图像的一种方法是热链接到中看到的图像。可能是我,但我只是被您的代码片段弄糊涂了。如果你能创建一个小的可编译和可运行的程序来演示你的问题,(正如上面@AndrewThompson所建议的),我想我们中的许多人会更好地帮助你。@HovercraftFullOfEels“也许是我”不,你不是一个人在那里。“Confusionville”的人口至少为2。如果max
小于430,max/430
将始终为0,因为它是整数除法。这可能是您的问题,在这种情况下,您可以简单地添加:max/430d
,以进行双除法。-1表示未发布。该构造非常值得付出努力,因此您不会后悔创建和发布它。它到底删除了什么功能?将非常小的值转换为中等大小的值的能力,或者对中等大小的值进行舍入的能力?当您趋向于更小或更大的数字时,双精度值会变得更不准确,导致您在这里看到的结果。我应该使用float还是long?或者它们也有同样的问题吗?长、int、short、&字节存储整数格式的信息浮点值和双字节存储浮点值格式的信息再看一看Math.round(),在这种情况下应该可以很好地工作
public void resize()
{
int max = 0;
int min = 0;
for (int i = 0; i < bars; i++)
{
if (getTime(i) > max)
max = (int)getTime(i);
}
yscaleplus = max/430;
/*
for (int i = (int)(getLife() - getRetire() + 1); i < bars; i++)
{
if (getTime(i) < min)
min = (int)getTime(i);
}
yscaleneg = Math.abs(min/200);
*/
xscale = bars/(800 - bars*5);
xscale = 1/xscale;
}
public void paintComponent (Graphics g)
{
super.paintComponent(g);
g.drawLine(100, 20, 100, 630);
g.drawLine(100, 450, 900, 450);
for (int i = 0; i < bars; i++)
{
barheight = (int) (getTime(i)/yscaleplus);
barwidth = (int) (xscale);
ypoint = 450 - barheight;
xpoint = 105+(barwidth + 5)*i;
if(ypoint < 450)
color = Color.green;
else
color = Color.red;
g.setColor(color);
g.fillRect(xpoint, ypoint, barwidth, barheight);
}
}