我正在使用Ruby on Rails 4构建一个财务应用程序,我需要在数据库中存储0.83423423432534634546
等值(SQLite和MySQL)。
我尝试将这些值作为decimals
存储在数据库中。
但是,我遇到了一些非常讨厌的浮点错误,所以我想将它们存储为integers
。
如何将0.4457546346354664233443
之类的值转换为整数,反之亦然?
感谢您的帮助。
答案 0 :(得分:4)
您的财务应用程序根本无法使用SQLite。
十进制(m,n)或数字(m,n)类型的值不会受到浮点错误的影响,除非它们被错误处理。
create table test (
-- 15 digits left of the decimal; 20 digits right of the decimal.
n decimal(35, 20)
);
insert into test values (123456789012345.83423423432534634546);
select * from test;
123456789012345.83423423432534634546
在 SQL 中,使用十进制和数字数据类型的算术在数字中完成。但是使用数字和浮点数进行算术运算,并且您将获得浮点数或双精度数。 (这是一种误操作。)
这在MySQL中可以正常工作(上图),但在SQLite(下面)中失败 - 没有错误或警告 - 。
sqlite> create table test (
...> -- 15 digits left of the decimal; 20 digits right of the decimal.
...> n decimal(35, 20)
...> );
sqlite>
sqlite> insert into test values (123456789012345.83423423432534634546);
sqlite>
sqlite> select * from test;
123456789012346.0
SQLite 否数字或十进制数据类型 1 。除了文字之外,它只为您提供15位数字,无论您说什么。
sqlite> delete from test;
sqlite> INSERT INTO "test" VALUES('123456789.123456789012345');
sqlite> select * from test;
123456789.123457
将列声明为文本会保留所有数字,但会中断算术。
sqlite> drop table test;
sqlite> create table test (n text);
sqlite> INSERT INTO "test" VALUES('123456789.123456789012345');
sqlite> select n from test;
123456789.123456789012345
sqlite> select n*2 from test;
246913578.246914
SQLite将答案四舍五入。
使用Rails,我在开发,测试,和生产环境中只使用MySQL或PostgreSQL。我只在我鬼混的时候使用SQLite。
答案 1 :(得分:1)
你的问题的答案是:如果你想保持小数点以下n位数的最大精度值,那么:
value
到整数:(value * 10 ** n).to_i
integer
原始值:integer / (10 ** n).to_f
但如果我是你,我宁愿听从塞尔吉奥的建议。