Android SQLite插入float类型浮点数小数位数异常(四舍五入过的两位小数变成13位小数)的原因和解决方法

news2024/11/16 2:35:32

浮点数异常截图:

 说明:

正常保留两位小数并正确插入的记录是通过db.execSQL(sql);方法插入的,而浮点数异常的是通过ContentValues db.insert() 方式插入的,可以发现问题出在db.insert()方法上,我又试过在put的时候直接输入类似166.88存进去又是正常的。

查看db.insert源码:

    public long insertWithOnConflict(String table, String nullColumnHack,
            ContentValues initialValues, int conflictAlgorithm) {
        acquireReference();
        try {
            StringBuilder sql = new StringBuilder();
            sql.append("INSERT");
            sql.append(CONFLICT_VALUES[conflictAlgorithm]);
            sql.append(" INTO ");
            sql.append(table);
            sql.append('(');

            Object[] bindArgs = null;
            int size = (initialValues != null && !initialValues.isEmpty())
                    ? initialValues.size() : 0;
            if (size > 0) {
                bindArgs = new Object[size];
                int i = 0;
                for (String colName : initialValues.keySet()) {
                    sql.append((i > 0) ? "," : "");
                    sql.append(colName);
                    bindArgs[i++] = initialValues.get(colName);
                }
                sql.append(')');
                sql.append(" VALUES (");
                for (i = 0; i < size; i++) {
                    sql.append((i > 0) ? ",?" : "?");
                }
            } else {
                sql.append(nullColumnHack + ") VALUES (NULL");
            }
            sql.append(')');

            SQLiteStatement statement = new SQLiteStatement(this, sql.toString(), bindArgs);
            try {
                return statement.executeInsert();
            } finally {
                statement.close();
            }
        } finally {
            releaseReference();
        }
    }

可以看到是因为 put进去的float类型数据被内部做了数据类型转换. SQLiteDatabase的db.insert()方法会根据传入的值类型自动转换数据类型,可能会导致精度丢失的问题.

        ContentValues values = new ContentValues();
        //values.put("id", pay.getId());
        values.put("name", pay.getName());
        values.put("amount", pay.getAmount());
        values.put("real_amount", pay.getReal_amount());
        values.put("yh_amount", pay.getYh_amount());

如何解决这个问题:?

1,将字段类型改成String

2,使用db.execSQL(sql);方法拼接原生SQL插入

3,  在java代码中做转换,使用BigDecimal来转换保存。(麻烦)

4,  将Java中定义的金额类型由float改成double(首选)

5,  将SQLite中的金额字段类型改成Integer整数,然后按最小单位处理,比如8.56保存为856做位移(大部分人的做法)

我选择了第2种或第4种(视情况),用回最原始的拼接SQL直接执行的方式,安全靠谱简单。哈哈

db.insert()方法会根据传入的值类型自动转换数据类型,可能会导致精度丢失的问题。在SQLite中,float类型的数据只能存储约7位有效数字,如果插入的数据精度超过了这个范围,那么SQLite会自动将其截断或四舍五入,从而导致小数位数变长的现象。

如果你需要在SQLite中存储精度较高的数据,可以考虑使用REAL类型或NUMERIC类型,它们都可以存储高精度的数据。另外,为了避免精度丢失的问题,你可以将float类型改为double类型,这样就可以存储更多位的有效数字。

得出一个结论,java中能不用float数据类型就尽量不要用 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/420214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

zabbix代理服务器部署

分布式监控的作用&#xff1a; ●分担 server 的集中式压力 ●解决多机房之间的网络延时问题 部署zabbix代理服务器 1、关闭防火墙、修改主机名 systemctl disable --now firewalld setenforce 0 hostnamectl set-hostname zbx-proxy su 2、设置zabbix的下载源&#xff0c;按…

7.2 模拟乘法器及其在运算电路中的应用

模拟乘法器是实现两个模拟量相乘的非线性电子器件&#xff0c;利用它可以方便地实现乘、除、乘方和开方运算电路。此外&#xff0c;由于它还能广泛地应用于广播电视、通讯、仪表和自动控制系统&#xff0c;进行模拟信号的处理&#xff0c;所以发展很快&#xff0c;称为模拟集成…

【微信小程序-原生开发】添加自定义图标(以使用阿里图标库为例)

方式一 &#xff1a; 下载svg导入 优点&#xff1a;操作方便&#xff0c;支持多彩图标缺点&#xff1a;会增加源代码大小 下载 svg 格式的图标图片&#xff0c;放入源码中使用 小程序项目中的路径为 assets\icon\美食.svg 使用时-代码范例 <image class"imgIcon"…

【JSP学习笔记】3.JSP 指令及动作元素

前言 本章介绍JSP的指令和动作元素。 JSP 指令 JSP指令用来设置整个JSP页面相关的属性&#xff0c;如网页的编码方式和脚本语言。 语法格式如下&#xff1a; <% directive attribute"value" %>指令可以有很多个属性&#xff0c;它们以键值对的形式存在&am…

属性文法和语法制导翻译

前言 前面通过词法分析&#xff0c;语法分析&#xff0c;DFA最后接受了一个输入实际上是理解了某一句编程语句&#xff0c;编译器的角色是将高级程序语言编译&#xff08;翻译&#xff09;为汇编代码&#xff0c;通过词法、语法分析编译器可以理解高级程序语言了&#xff0c;那…

JavaScript + DOM

JavaScript 官方文档 https://www.w3school.com.cn/js/index.asp 基本说明 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SgjOIfTi-1681034533049)(E:\Kuangshen\学习笔记\韩顺平java\JavaScript_img\image-20230409130530115.png)] <!DOCT…

华为手表开发:WATCH 3 Pro(18)传感器订阅 方向传感器

华为手表开发&#xff1a;WATCH 3 Pro&#xff08;18&#xff09;传感器订阅 方向传感器初环境与设备方向传感器鸿蒙开发文件夹&#xff1a;文件新增展示的文本标记index.hmlindex.cssindex.js初 希望能写一些简单的教程和案例分享给需要的人 鸿蒙可穿戴开发 环境与设备 系…

Java设计模式之状态模式

状态模式 状态模式允许一个对象在其内部状态改变的时候改变其行为 应用场景 1、一个对象的行为取决于它的状态&#xff0c;并且它必须在运行时根据状态改变它的行为 2、操作中含有庞大的多分支的条件语句&#xff0c;且这些分支依赖于该对象的状态。这个状态通常用一个或者…

管廊隧道怎么定位人员?分享管廊隧道人员定位系统解决方案

管廊隧道施工的安全不仅关系着施工项目的质量与施工效率&#xff0c;更是关系着国家财产安全以及施工人员和人民群众的生命和财产安全。如何有效加强管廊隧道施工安全管理水平成为管廊隧道项目施工企业管理者最为关注的问题。 管廊隧道施工安全管理痛点难题 1.风险预警难 现场…

《数据库系统概论》第三章课后习题 (4个表+三建工程项目)

目录 5. 针对习题4中的4个表试用SQL完成以下各项操作&#xff1a; 9. 为三建工程项目建立一个供应情况的视图&#xff0c;包括供应商代码SNO, 零件代码PNO, 供应数量QTY&#xff0c;针对该视图完成下列查询&#xff1a; 5. 针对习题4中的4个表试用SQL完成以下各项操作&#x…

Resnet代码详解

这篇文章是用来讲解Resnet(残差网络)代码的&#xff0c;结合代码理解残差网络结构。 目录 Bottleneck类 Conv33 Conv11 BasicBlock ResNet _make_layer代码解析 完整的ResNet代码&#xff1a; 可以直接调用torch内置的resnet官方代码。 from torchvision.models impo…

华为手表开发:WATCH 3 Pro(19)传感器订阅 光线传感器

华为手表开发&#xff1a;WATCH 3 Pro&#xff08;19&#xff09;传感器订阅 光线传感器初环境与设备光线传感器鸿蒙开发文件夹&#xff1a;文件新增展示的文本标记index.hmlindex.cssindex.js初 希望能写一些简单的教程和案例分享给需要的人 鸿蒙可穿戴开发 环境与设备 系…

IP子网划分例题详解

子网划分概念&#xff1a; 通过改变ip的掩码长度来改变ip的网络地址&#xff0c;把原来的ip地址从网络位主机位&#xff0c;改成网络位子网位主机位。从而达到缩小主机个数或者扩大主机个数。缩小主机位&#xff0c;可以避免ip资源的浪费&#xff0c;减小广播域&#xff0c;提…

当对象释放时,避免析构函数调用两次

在上一篇文章中&#xff0c;我们提到过&#xff0c;在一个对象的析构函数中执行太多任务&#xff0c;可能导致对象被释放两次。解决此问题的标准方法是在析构过程中使用一个自定义的引用计数&#xff0c;如下图所示&#xff1a; >> 请移步至 topomel.com 以查看图片 <…

【Python】爬虫数据提取

目录 一、xpath提取数据 二、爬虫爬取图片资源 三、爬虫爬取视频资源 四、FLV文件转码为MP4文件 一、xpath提取数据 <bookstore> <book category"Python 基础"><title lang"cn">cook book</title><author>David Beazle…

PROFINET1.8.0.5协议移植问题汇总

注&#xff1a;记录个人移植过程遇到的问题&#xff0c;正在更新。。。 PROFINET1.8.0.5协议移植遇到问题汇总&#xff1a; 软件环境&#xff1a;TIA_V17 硬件环境&#xff1a;stm32F205_ZET6主控芯片TPS-1 PROFINET IO 20500PF00&#xff08;芯片物料编码B0001.0.2&#xff09…

LabVIEW-数组数据类型

数组是将一系列、同一类型的数据组合到一起。在LabVIEW 中&#xff0c;数组可以是字符串类型、数值型或者布尔型等多种数据类型中的同类数据的集合。但不能创建以数组为元素的数组&#xff0c;也不能创建图标和图形数组。 目录 创建数组 ​编辑 数组相关函数 求数组大小 初…

并发集合ConcurrentHashMap、CopyOnWriteArrayList

一、ConcurrentHashMap 1.1 存储结构 ConcurrentHashMap是线程安全的HashMap ConcurrentHashMap在JDK1.8中是以CAS+synchronized实现的线程安全 CAS:在没有hash冲突时(Node要放在数组上时) synchronized:在出现hash冲突时(Node存放的位置已经有数据了) 存储的结构:…

移动机器人路径跟踪的设计和仿真模型预测控制(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 在轨迹跟踪应用领域&#xff0c;通常 MPC 建模可根据机器人的控制方式选择基于运动学运动状态方程建模或者基于动力学运动状态…

【JavaEE初阶】计算机工作原理

摄影分享~ 文章目录冯诺依曼体系操作系统操作系统的定位进程/任务&#xff08;process/task&#xff09;内存管理冯诺依曼体系 线代的计算机&#xff0c;大多遵守冯诺依曼体系结构。 CPU 中央处理器: 进行算术运算和逻辑判断. 存储器: 分为外存和内存, 用于存储数据(使用二进…