mysql中的float和double数据类型未存储java程序所需的完整数字
我正在使用JavaSwing应用程序在mysql数据库中存储一些值,但它没有存储输入的全部数字。例如,如果我使用float作为mysql数据库列的数据类型,它只存储6位数字,如果我输入123456.56,它只存储123456.00,或者如果我输入12345.67,它只存储12345.60。当我将mysql的数据类型更改为double时也是一样,它只存储8位数字,因此如果我输入1234567.89,它只存储1234567.90位数字,并将第8位数字取整。我的编码有什么问题?谢谢我希望将全额存储在数据库中,例如数百万和几十万,例如12345678.55或445874.44,而无需将其转换为指数量或缩短。我该怎么做mysql中的float和double数据类型未存储java程序所需的完整数字,java,mysql,floating-point,double,decimal,Java,Mysql,Floating Point,Double,Decimal,我正在使用JavaSwing应用程序在mysql数据库中存储一些值,但它没有存储输入的全部数字。例如,如果我使用float作为mysql数据库列的数据类型,它只存储6位数字,如果我输入123456.56,它只存储123456.00,或者如果我输入12345.67,它只存储12345.60。当我将mysql的数据类型更改为double时也是一样,它只存储8位数字,因此如果我输入1234567.89,它只存储1234567.90位数字,并将第8位数字取整。我的编码有什么问题?谢谢我希望将全额存储在数
if(source == btn_confirm)
{
dbconnect connect = new dbconnect();
String page = text_page.getText();
String line = text_line.getText();
String refpage = text_refpage.getText();
String refline = text_refline.getText();
String transaction_date = text_transdate.getText();
String description = text_desc.getText();
String account_code = text_accountcode.getText();
String code_type = text_codetype.getText();
String issue_date = text_issuedate.getText();
String amount = text_amount.getText();
System.out.println(amount);
try
{
connect.addTransaction(page, line, refpage, refline, transaction_date, description, account_code, code_type, issue_date, amount);
connect.close();
}
catch (Exception x)
{
System.out.println(x);
}
text_page.setText("");
text_line.setText("");
text_refpage.setText("");
text_refline.setText("");
text_transdate.setText("");
text_desc.setText("");
text_accountcode.setText("");
text_codetype.setText("");
text_issuedate.setText("");
text_amount.setText("");
text_page.requestFocus();
}
文本金额是包含要传递给字符串金额的数字的文本字段。string过去是一个float,但我选择使用string,因为我认为在将它传递到sql语句中时,它不会有多大区别。我以前用的是parsefloat
addTransaction方法向mysql数据库添加一个事务,如下所示:
public void addTransaction(String page, String line, String refpage, String refline, String transaction_date, String description, String account_code, String code_type, String issue_date, String amount) throws Exception
{
try
{
connect();
statement = conn.createStatement();
statement.executeUpdate("insert into transaction (page, line, refpage, refline, transaction_date, description, account_code, code_type, issue_date, amount) values ('" + page + "', '" + line + "', '" + refpage + "', '" + refline + "', '" + transaction_date + "', '" + description + "', '" + account_code + "', '" + code_type + "','" + issue_date + "', " + amount + ")");
System.out.println("Inserted transaction of page: " + page + " and line: " + line);
}
catch (Exception e)
{
throw e;
}
}
您是如何初始化该列的?如果存储为float,则可以使用以下格式存储它-float(M,D),其中M是总位数,D是小数点后的位数 如果已经创建了表,并且不希望丢失表中已存储的信息,则可以使用以下查询修改列类型:
ALTER TABLE tableName
ALTER COLUMN columnName FLOAT(M,D);
相应地更换M和D
FLOAT
只有24位精度。这相当于大约7位十进制数字。因此,不可能存储比您看到的更多的内容
FLOAT(12,2)
在我看来没有任何用处。它四舍五入两次——一次是十进制,一次是二进制。使用十进制(12,2)
或普通浮点
或双精度
DOUBLE
提供大约16位精度。同样,不要使用(m,n)
,也不要期望它能容纳更多的53位数字
MySQL可以处理65位十进制数字:
decimal(65,…)
。但是,它是固定的,因为您在小数点后指定了一个固定的位数。我在哪里初始化或实现它?我使用mysql workbench,没有初始化或输入M或D的功能。谢谢。当您创建表时,您已经定义了每一列,在列类型中输入FLOAT(M,D)并根据需要替换M和D。如果这不起作用,那么您的swing应用程序可能无法传递整个数字。谢谢,我在alter table中找到了它,并更改了数据类型中的值。。是的,你是对的,我的Java swing应用程序没有传递完整的数字,并将其转换为指数,并将其剪切到第8位。我使用amount=Float.parseFloat(text_amount.getText());要将我的文本字段号转换为浮点数,有没有办法纠正这个问题?我已经将浮点数设置为(12,2),但它仍然舍入到第7位。没关系,我已经解决了它,我将Mysql中的数据类型改为Deciman(12,2)。这似乎可行。谢谢。你怎么知道它被截断了呢?用Java和MySQL向我们展示接收数据并显示缩短结果的代码,以及所有声明。编辑了这个问题供你审阅。text\u amount
的声明是什么?它是float
还是float
或其他什么?Text\u amount是一个文本字段,表中amount
的“数据类型”是什么?有多个地方可能发生转换;为了回答您的问题,我们需要识别它们。