Java 结果总是错误的

Java 结果总是错误的,java,Java,我想创建一个简单的计算器$21.37可以更改为21 1美元硬币、0 50美分硬币、1 20美分硬币。但是,我的剩余结果总是错误的,我不明白为什么。下面是我的代码,请大家帮忙,谢谢大家 import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Question extends JFrame implements ActionListener { private JLabel amt,doll

我想创建一个简单的计算器$21.37可以更改为21 1美元硬币、0 50美分硬币、1 20美分硬币。但是,我的剩余结果总是错误的,我不明白为什么。下面是我的代码,请大家帮忙,谢谢大家

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Question extends JFrame implements ActionListener
{
    private JLabel amt,dollar,fifty,title,result,error,creator;
    private TextField tb1,tb2,tb3;
    private JButton count;
    public Question()
    {
        setSize(400,300);
        JPanel contentPane = new JPanel(null);
        contentPane.setBorder(BorderFactory.createLineBorder(Color.gray));
        setContentPane(contentPane);
        count = new JButton("=");
        title = new JLabel("Calculate Change");
        amt = new JLabel("Enter the amount:");
        dollar = new JLabel("1 Dollar Coin:");
        fifty = new JLabel("50 Cent Coin:");
        error = new JLabel("wrong information.");
        creator = new JLabel("Created by ?????");
        Font bold = new Font("Arial",Font.BOLD,15);
        Font wrong = new Font("Arial",Font.ITALIC,12);
        Font smaller = new Font("Arial",Font.ITALIC,10);
        error.setForeground(Color.red);
        tb1 = new TextField(13);
        tb2=new TextField(12);
        tb3= new TextField(12);
        tb2.setEnabled(false);
        tb3.setEnabled(false);
        creator.setFont(smaller);
        error.setFont(wrong);
        title.setFont(bold);
        title.setBounds(130,-14,150,40);
        amt.setBounds(20, 20, 120, 20);
        dollar.setBounds(40, 45, 120, 20);
        fifty.setBounds(40, 70, 120, 20);
        tb1.setBounds(160, 21, 90, 24);
        tb2.setBounds(160, 45, 90, 20);
        tb3.setBounds(160, 70, 90, 20);
        error.setBounds(260,170,150,20);
        count.setBounds(100,200,90,20);
        creator.setBounds(240,220,180,20);
        contentPane.add(title);
        contentPane.add(amt);
        contentPane.add(dollar);
        contentPane.add(fifty);
        contentPane.add(tb1);
        contentPane.add(tb2);
        contentPane.add(tb3);
        contentPane.add(error);
        contentPane.add(creator);
        contentPane.add(count);
        count.addActionListener(this);
    }

    public void actionPerformed(ActionEvent e)
    {
        try
        {
            //String input = tb1.getText();
            double convert = Double.parseDouble(tb1.getText());
            if((e.getSource() == count) && (convert >=1)) 
            {
                double result;
                result = convert /1;
                convert = convert % 1;
               int result2 = (int)result;
                String result3 = String.valueOf(result2);
                tb2.setText(result3);

            }
            if((convert >= 0.5) && (convert < 0.99))
            {
                tb3.setText("1");
                convert = convert % 0.5;
                  String result4 = String.valueOf(convert);
                error.setText(result4);
            }
           }catch(Exception ex)
        {
            error.setText("Invalid input.");
        }
    }

    public static void main(String []args)
    {
        Question frame = new Question();
        frame.setVisible(true);
    }
}
import java.awt.*;
导入javax.swing.*;
导入java.awt.event.*;
公共类问题扩展JFrame实现ActionListener
{
私人JLabel金额,美元,50,标题,结果,错误,创建者;
专用文本字段tb1、tb2、tb3;
私人按钮计数;
公众问题(
{
设置大小(400300);
JPanel contentPane=新的JPanel(null);
setboorder(BorderFactory.createLineBorder(Color.gray));
setContentPane(contentPane);
计数=新的JButton(“=”);
标题=新JLabel(“计算变更”);
金额=新的JLabel(“输入金额:”);
美元=新的JLabel(“1美元硬币”);
50=新的JLabel(“50美分硬币”);
错误=新JLabel(“错误信息”);
创建者=新的JLabel(“创建人”);
字体粗体=新字体(“Arial”,字体粗体,15);
字体错误=新字体(“Arial”,字体斜体,12);
字体较小=新字体(“Arial”,字体斜体,10);
错误。设置前景(颜色为红色);
tb1=新文本字段(13);
tb2=新文本字段(12);
tb3=新文本字段(12);
tb2.设置启用(假);
tb3.设置启用(假);
creator.setFont(较小);
错误。设置字体(错误);
title.setFont(粗体);
标题.立根(130,-14150,40);
退让金额(20,20,120,20);
美元.下跌(40,45,120,20);
50.挫折(40、70、120、20);
tb1.立根(160、21、90、24);
tb2.立根(160,45,90,20);
tb3.立根(160、70、90、20);
误差.立根(260170150,20);
立根数(100200,90,20);
创造者.挫折(240220180,20);
contentPane.add(标题);
contentPane.add(amt);
contentPane.add(美元);
contentPane.add(五十);
contentPane.add(tb1);
contentPane.add(tb2);
contentPane.add(tb3);
contentPane.add(错误);
contentPane.add(创建者);
contentPane.add(count);
count.addActionListener(这个);
}
已执行的公共无效操作(操作事件e)
{
尝试
{
//字符串输入=tb1.getText();
double convert=double.parseDouble(tb1.getText());
如果((例如getSource()==count)&&(convert>=1))
{
双重结果;
结果=convert/1;
convert=转换为%1;
int result2=(int)结果;
String result3=String.valueOf(result2);
tb2.setText(结果3);
}
如果((转换>=0.5)和&(转换<0.99))
{
tb3.setText(“1”);
转换=转换%0.5;
String result4=String.valueOf(convert);
错误。setText(结果4);
}
}捕获(例外情况除外)
{
错误.setText(“无效输入”);
}
}
公共静态void main(字符串[]args)
{
问题框架=新问题();
frame.setVisible(true);
}
}

您应该格式化结果。因此,不是:

String result3 = String.valueOf(result2);
考虑做:

String result3 = String.format("%.2f", result2);
这将删除尾随数字,并将数字四舍五入以供显示


有关如何使用
String.format(…)
的更多详细信息,请查看由于使用
%0.5

double convert = Double.parseDouble("21.37");

int oneDollarCoins = (int) convert; // throws away the fractions
System.out.println(oneDollarCoins); // prints 21
convert -= oneDollarCoins;
int cents = (int) (convert * 100);
System.out.println(cents); // prints 37
// modulo the cents % 50, 20, ...
// don't use % 0.5

对于较小的数字
double
应该可以,但是对于较大的数字,您可能会得到其他人提到的错误结果。

您到底想要实现什么,预期的输出是什么,请参考感兴趣的行。代码中充满了无用的东西,只发布相关的代码(actionPerformed)并发布输入/输出示例。当需要精确精度时,不应使用
double
s或
float
s。像
21.37
这样的十进制数不能准确地存储在浮点变量中。请参阅并使用整数算术(以美分为单位)。呵呵,我刚刚输入了它。顺便说一句,我想应该是结果;)@enterbios:我想这是针对result3和result4的但是谢谢你的评论!