Тип данных float и double в MySQL не хранит полные цифры, необходимые для моей Java-программы - PullRequest
1 голос
/ 04 июля 2019

Я храню некоторые значения в моей базе данных MySQL, используя мое приложение Java Swing, но оно не хранит всю сумму введенного числа. Например, если я использую float в качестве типа данных для столбца базы данных mysql, он будет хранить только 6 цифр, если я введу 123456.56, он сохранит только 123456.00 или если я введу 12345.67, он сохранит только 12345.60. То же самое, когда я изменил тип данных mysql на удвоение, он хранит только 8 цифр, поэтому, если я введу 1234567.89, он сохранит только 1234567.90 и округлит восьмую цифру. Что не так с моим кодированием? Благодарю. Я хотел бы хранить всю сумму в базе данных, например, миллионы и сотни тысяч, напр. 12345678.55 или 445874.44 в полном объеме, не превращая его в показатель степени или не сокращая его. Как мне это сделать?

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();
        }

text_amount - текстовое поле, содержащее число, которое будет передано в строковую сумму. Строка раньше была float, но я решил использовать вместо нее строку, так как думал, что это не будет иметь большого значения при передаче ее в оператор SQL. Я использовал парсефлоат.

метод 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;
    }
}

Ответы [ 2 ]

0 голосов
/ 06 июля 2019

FLOAT имеет только 24 бита точности.Это соответствует примерно 7 десятичным цифрам.Таким образом, невозможно хранить больше, чем вы видите.

FLOAT(12,2) не имеет смысла, что я могу понять.Он округляется дважды - один раз в десятичную, один раз в двоичную.Использование DECIMAL(12,2) или обычного FLOAT или DOUBLE.

DOUBLE дает вам около 16 цифр точности.Опять же, не используйте (m,n) с ним и не ожидайте больше цифр, которые он может содержать в 53 битах .

MySQL может обрабатывать 65 десятичных цифр: DECIMAL(65, ...).Однако фиксировано в том смысле, что вы указываете постоянное количество знаков после запятой.

0 голосов
/ 04 июля 2019

Как вы инициализировали столбец?Если вы храните как float, вы можете сохранить его в следующем формате - FLOAT (M, D), где M - общее количество цифр, а D - количество цифр после десятичной точки.

ЕслиВы уже создали свою таблицу и не хотите потерять информацию, уже сохраненную в ней, тогда вы можете изменить тип столбца следующим запросом:

ALTER TABLE tableName
ALTER COLUMN columnName FLOAT(M,D); 

Замените, M и D соответственно.

Источник

...