java开发中,一般涉及到金钱计算的时候用啥数据类型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java开发中,一般涉及到金钱计算的时候用啥数据类型相关的知识,希望对你有一定的参考价值。
回答: 一般使用 java.math.BigDecimal 类来处理需要高精度的计算
原因: 1.浮点数(double,flot)因为精度问题, 容易出现不精确的计算结果
2.浮点数范围比较小
BigDecimal 范围大, 并且比他们精确
参考代码
public class Demo
public static void main(String[] args)
//浮点数,存在精度问题
double d1 = 0.19*6;
System.out.println(d1);//1.1400000000000001
//采用BigDecimal 来解决精度问题
BigDecimal bd1 = new BigDecimal("0.19");
BigDecimal bd2 = new BigDecimal("6");
BigDecimal bd3 = bd1.multiply(bd2);
System.out.println(bd3);//1.14
输出
1.14000000000000011.14 参考技术A 建议使用java.math.BigDecimal 参考技术B Java开发中,一般涉及到金钱计算的时候用Java.math.BigDecima类型。学java开发推荐千锋教育。千锋教育“把握教育质量生命线”是千锋服务学员、服务高校、服务企业的核心点,千锋历来重视教研教学,自创立伊始便成立了职业教育科学研究机构——千锋教研院,并且每年千万投入用于教研。
浮点型常量 Java的实常数有两种表示形式:十进制数形式,由数字和小数点组成,且必须有小数点,如0.123, .123, 123. ,123.0 。 科学计数法形式。如:123e3或123E3,其中e或E之前必须有数字,且e或E后面的指数必须为整数。实常数在机器中占64位,具有double型的值。对于float型的值,则要在数字后加f或F,如12.3F,它在机器中占32位,且表示精度较低。浮点型变量 浮点型变量的类型有float和double两种。 数据类型所占位数的范围: float 32位 3.4e-038~3.4e+038 ; double 64位 1.7e-308~1.7e+308 ; 双精度类型double比单精度类型float具有更高的精度,和更大的表示范围。
想要了解更多关于java开发的相关信息,推荐咨询千锋教育。千锋教育成立教研学科中心,推出贴近企业需求的线下技能培训课程。课程包含html5大前端培训、JavaEE+分布式开发培训、Python人工智能+数据分析培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、网络安全培训、区块链培训、影视剪辑包装培训、游戏原画培训、全媒体运营培训。
QT数据库访问技术简介
背景介绍
本人使用过PHP/C#/VB/VB.NET/JAVA等编程语言开发过基于数据库方面的应用,相对于其它编程语言来说,个人感觉QT的数据库访问框架在设计时有些混乱,所以在最开始使用的时候一度有些困惑。在后来多次使用QT开发应用的过程中,才慢慢使用了QT的数据库访问框架。
功能对比
一般来说,涉及到数据库访问的框架会有如下功能的类:数据库驱动管理类、数据库连接类、执行增删改查的数据库操作类、用于接收执行查询操作返回的结果集的类、数据库事务管理类以及数据库异常方面的类。
例如在Java和C#中大概的对应关系如下:
| Java | C# |
数据库驱动层 | java.sql.Driver | System.Data.Common.DbProviderFactory |
数据库连接层 | java.sql.Connection | System.Data.Common.DbConnection |
数据库执行层 | java.sql.Statement java.sql.PreparedStatement | System.Data.Common.DbCommand System.Data.Common.DbDataAdapter |
结果集表示层 | java.sql.ResultSet | System.Data.Common.DataReader System.Data.Common.DataTable System.Data.DataRow System.Data.DataColumn |
数据库事务层 | java.sql.Connection.commit(); java.sql.Connection.rollback(); | System.Data.Common.DbTransaction.commit() System.Data.Common.DbTransaction.rollback() |
数据库异常 | java.sql.SQLException | System.Data.Common.DbException |
说明:在Java SE中定义的以接口居多,需要具体的数据库实现。在C#中微软分别提供了接口(位于System.Data命名空间下)、抽象类(位于System.Data.Common命名空间下)和针对一些具体数据库的实现类。在上表中C#部分主要是抽象类。另外,由于语言的不同,很难将相关的类或接口完全严格地填入上面的表中,只能是近似。
在QT的数据库编程访问体系中,主要提供了QSqlDatabase、QSqlDriver、QSqlError、QSqlField、QSqlIndex、QSqlQuery、QSqlQueryModel、QSqlRecord、QSqlResult、QSqlTableModel类,除了上述类之外还有QSqlDriverCreator、QSqlDriverCreatorBase、QSqlRelationalTableModel类。如果按照上述的功能划分,那么表格基本可以理解:
| QT | 说明 |
数据库驱动层 | QSqlDriver |
|
数据库连接层 | QSqlDatabase | QSqlDatabase.exec(const QString &query = QString())可以直接执行SQL语句 |
数据库执行层 | QSqlQuery |
|
结果集表示层 | QSqlRecord QSqlField QSqlIndex QSqlResult QSqlQueryModel QSqlTableModel |
|
数据库事务层 | QSqlDatabase.commit(); QSqlDatabase.rollback(); |
|
数据库异常 | QSqlError |
|
QT中数据库操作常用类介绍
在QT的帮助文档里,QT将上述的数据库相关的类分为三个层级,最底层的一个层级为驱动层,在这个层级的类有:QSqlDriver、QSqlDriverCreator、QSqlDriverCreatorBase等,在驱动层之上是SQL接口层,在这个层级的类有QSqlDatabase、QSqlQuery、QSqlField、QSqlRecord、QSqlIndex、QSqlError等,在SQL接口层之上是用户接口层,用户接口层的类有QSqlQueryModel、QSqlTableModel及QSqlRelationalTableModel等。
对于上面的类的作用介绍如下:
序号 | 类 | 说明 |
1 | QSqlDriver | 这个类一般不会直接使用,除非想开发自己的数据库驱动。它是用于访问特定数据库的抽象类。 |
2 | QSqlDatabase | 用于连接数据库的类,提供了数据库连接、访问和事务控制等功能,并且还支持获取当前支持的驱动(QSqlDatabase::drivers())、直接支持SQL语句(QSqlDatabase.exec(const QString &query = QString()))、获取指定表的主键(QSqlDatabase::primaryIndex(const QString &tablename))、获取指定表的字段信息(QSqlDatabase::record(const QString &tablename))等操作。 |
3 | QSqlQuery | 用于执行SQL语句的类,支持通过QSqlQuery::boundValue()的重载形式来执行参数化SQL语句。通过QSqlQuery::record()方法返回结果集中的一行记录,通过QSqlResult *QSqlQuery::result()返回结果集,通过QSqlQuery::value()重载形式返回指定字段的值。 |
4 | QSqlRecord | 用于封装数据库记录的类,QSqlRecord封装了数据库表或视图中的一行记录,一个QSqlRecord可能包含0到多个QSqlField,可以用QSqlRecord::field()的重载形式获取QSqlRecord中包含的QSqlField,也可以用QSqlRecord::value()的重载形式获取QSqlRecord各字段的值(返回值为QVariant,需要根据实际字段类型进行转换) |
5 | QSqlField | 用于封装数据库表或视图中的字段,通过QSqlField类可以获取字段的名称、所属表名、是否允许为空、默认值、字段长度、是否为空、字段类型、字段值等信息。 |
6 | QSqlIndex | 用于封装数据库索引的类,通过QSqlIndex类可以获取索引的名称、索引是降序或升序等信息。 |
7 | QSqlResult | 用于封装数据库特定的数据而抽象的类,通常情况应尽量使用QSqlQuery而不是QSqlResult,QSqlQuery在QSqlResult的基础上提供了一层封装。如果需要实现自己的数据库驱动,那么就需要实现自己的QSqlResult类,一般情况下尽量使用QSqlQuery吧。 |
8 | QSqlError | 用于封装数据库错误信息的类,可以通过QSqlError::isValid()来判断是否发生了数据库错误,在发生错误的情况下可以通过QSqlError::databaseText()获取数据库报告的错误,通过QSqlError::driverText()获取驱动程序报告的错误,还可以通过QSqlError::nativeErrorCode()获取数据库层面的本地错误代码,QSqlError::nativeErrorCode()现在软件开发、一般都用啥语言啊! |