mysql:列类型之float、double

2023-09-13 13:19:19

mysql:列类型之float、double_mysql double_普通网友的博客-CSDN博客

环境:

    window10
    vs2022
    .net 6
    mysql 8.0.25
    DBeaver

    参考:
    《MSDN:浮点数值类型(C# 引用)》
    《mysql:11.1.4 Floating-Point Types (Approximate Value) - FLOAT, DOUBLE》

1. float和double类型

在mysql中,float和double都是浮点数类型:

    float 占4个字节,精度是6位;
    double 占8个字节,精度是16位;

它们的性质和c#中浮点数的性质是一样的,只不过精度要求的更严格和明确一些;

    参照:c#中浮点型的精度要求为在这里插入图片描述

测试mysql中的float和double:

create table test(
   t_float float,
   t_double double
)

insert into test.test (t_float) values(123456);-- 正常
insert into test.test (t_float) values(1234567);-- 四设五入 1234570
insert into test.test (t_float) values(12345678901);-- 失真 12345700352

insert into test.test (t_float) values(12345.6); -- 正常
insert into test.test (t_float) values(12345.62); -- 四设五入 12345.6
insert into test.test (t_float) values(123.123); -- 正常
insert into test.test (t_float) values(12.1234); -- 正常
insert into test.test (t_float) values(1.12345); -- 正常
insert into test.test (t_float) values(1234.1234); -- 四设五入 1234.12

-- double
insert into test.test (t_double) values(1234567890123456);-- 正常
insert into test.test (t_double) values(12345678901234567);-- 四设五入 12345678901234568
insert into test.test (t_double) values(123.12345678901);-- 正常
insert into test.test (t_double) values(1234567890.123456);-- 正常

select * from test

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

输出如下:
在这里插入图片描述

我们可以认为是这样的:
当我们把数据插入float类型时,mysql会优先保留6位有效数字,对右侧的数字进行四舍五入;
当我们把数据插入double类型时,mysql会优先保留16位有效数字,对右侧的数字进行四设五入;

    注意:mysql不会因为数据超范围而报错,比如:12345678901远超精度,但它只会数据失真并不会报错。

2. float和double语法

推荐的使用方法是:t_float float、t_double double,即:不添加其他参数。

但为了兼容sql标准,mysql中提供:float(p)这种写法,这里的p取值范围是:[0,53],超过范围会报错,另外:这里的p仅用来决定mysql内部采用float还是double存储,当p∈[0,23] 时,mysql采用float存储,当p∈[24,53]时,mysql采用double存储。
3. float和double的非推荐用法

上面说的是推荐用法,在推荐用法中mysql的float和c#的float行为表现基本一致。

还有非标准用法,比如:float(M,D),不过这种写法即将被弃用了。

虽然是被弃用,但它好像也并非一无是处:
float(M,D)中的M表示总有效数字,D表示小数位数。这有点像decimal(M,D)的M和D。

如果我们定义:float(5,2)的话,就表示:小数点后最大2位,小数点前最大3位,小数点前超过3位将报错,小数点后超过2位将四舍五入;

测试如下:

create table test(
    t_float5_2 float(5,2)
)

insert into test.test (t_float5_2) values(123.12);-- 正常
insert into test.test (t_float5_2) values(1234.1);-- 报错: Out of range value
insert into test.test (t_float5_2) values(1.1234);-- 四设五入 1.12

select * from test

    1
    2
    3
    4
    5
    6
    7
    8
    9

输出如下:
在这里插入图片描述

可以看到这种非标准用法限制更严格一点,不过因为它即将被启用,不做过多探索。

    另外,double类型没有非标准的 double(M,D) 写法!

另外,除了float(M,D)还有real(M,D)和double precision(M,D)。

这里总结下它们的用法和区别:

在这里插入图片描述
4. c#中使用方式

由于mysql中的float和double都是浮点型数据,基本和c#中的float和double一一对应,所以在c#中我们完全可以使用float和double分别去替代,但一般我们在c#中会统一使用double,如下:

public class Model
{
    public double? t_float { get; set; }
    public double? t_double { get; set; }
}

    1
    2
    3
    4
    5

5. 最后看下它们的元数据

create table test(
    t_float float,
    
    t_float7 float(7),
    t_float10 float(10),
    t_float35 float(35),
    t_float40 float(40),    
    
    t_double double,
--  t_double double(5), -- 报错
    
    t_float7_5 float(7,5), -- 弃用
    
    t_real real,
    t_real7_5 real(7,5),
    
    t_double_precision8_5 double precision(8,5)
)

select c.TABLE_SCHEMA ,c.TABLE_NAME ,c.COLUMN_NAME ,c.ORDINAL_POSITION,c.DATA_TYPE,c.NUMERIC_PRECISION ,c.COLUMN_TYPE ,c.NUMERIC_SCALE
from information_schema.`COLUMNS` c  where TABLE_SCHEMA ='test' and TABLE_NAME ='test' order by ORDINAL_POSITION

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21

在这里插入图片描述
最后

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

小编已加密:aHR0cHM6Ly9kb2NzLnFxLmNvbS9kb2MvRFVrVm9aSGxQZUVsTlkwUnc==出于安全原因,我们把网站通过base64编码了,大家可以通过base64解码把网址获取下来。
————————————————
版权声明:本文为CSDN博主「普通网友」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_67392661/article/details/126803834

更多推荐

高云FPGA系列教程(8):ARM串口数据接收(中断和轮询方式)

文章目录@[toc]1.GW1NSR-4C串口外设简介2.FPGA配置3.常用函数4.轮询方式接收数据5.中断方式接收数据本文是高云FPGA系列教程的第8篇文章。本篇文章介绍片上ARMCortex-M3硬核处理器串口外设的使用,演示轮询方式和中断方式接收串口数据,并进行回环测试,基于TangNano4K开发板。参考文档

享元模式模式简介

概念:享元模式(Flyweightpattern)是一种结构型设计模式,旨在通过共享对象来减少内存使用和提高性能。它通过将对象的状态分为可共享的内部状态和不可共享的外部状态,来实现对象的共享。内部状态可以被多个对象共享,而外部状态则取决于具体的对象。通过共享内部状态,可以减少系统中相似对象的数量,从而节省内存空间。特点

【论文阅读 09】融合门控自注意力机制的生成对抗网络视频异常检测

2021年中国图象图形学报摘要背景:视频异常行为检测是智能监控技术的研究重点,广泛应用于社会安防领域。当前的挑战之一是如何提高异常检测的准确性,这需要有效地建模视频数据的空间维度和时间维度信息。生成对抗网络(GANs)因其结构优势而被广泛应用于视频异常行为检测。方法:本文提出了一种改进的生成对抗网络方法,用于视频异常行

OpenCV实现的F矩阵+RANSAC原理与实践

1RANSAC筛选1.1大致原理Randomsampleconsensus(RANSAC),即随机抽样一致性,其是一种用于估计模型参数的迭代方法,特别适用于处理包含离群点(outliers)的数据集RANSAC的主要思想是随机采样数据点,用这些采样点拟合一个模型,然后计算其他数据点到这个模型的拟合误差;根据误差和阈值,

什么是异步编程?解释异步编程的优势和实现方式

1、什么是异步编程?解释异步编程的优势和实现方式。异步编程是一种编程模型,它将程序中的计算任务分成独立的阶段,并在每个阶段完成后立即返回结果。异步编程模型通常用于处理长时间运行的任务,例如网络请求、IO操作等,以避免阻塞主线程,提高程序的响应性能。异步编程的优势:减少阻塞:异步编程可以避免主线程被长时间运行的任务阻塞,

Go语言支持闭包吗?说说你对它的理解

1.引言闭包是编程语言中的一个重要概念,它允许函数不仅仅是独立的代码块,还可以携带数据和状态。闭包的特点是可以捕获并保持对外部变量的引用,使函数值具有状态和行为,可以在多次调用之间保留状态。本文将深入探讨闭包的定义、用途和注意事项,以及如何正确使用闭包。2.什么是闭包闭包是一个函数值,它引用了在其外部定义的一个或多个变

[2023.09.20]:Yew的前端开发经历小结

今天基本上完成了一个操作闭环,即能够保存,拉取和删除数据。截个图这个过程的前端和后端都是用Rust写的,前端使用的是Yew。Yew是一种用于构建现代Web应用程序的Rust框架,其计目标是提供一种安全、高效、易用的方式来构建Web应用程序。Yew基于WebAssembly(Wasm)技术,将Rust代码编译为能在浏览器

Redis 哈希表操作实战(全)

目录HSET添加HSETNX添加HMSET批量添加HGET获取元素HGETALL获取所有HMGET批量查询HEXISTS判断是否存在HINCRBY增加整数HINCRBYFLOAT添加浮点数HLEN查Field数量HKEYS查所有FieldHVALS查所有Field值HSCAN迭代HDEL删除FieldHSET添加HSE

2023复旦大学计算机科学技术(网络空间安全)保研记录

BG:中九rank前5%、科研经历少、无竞赛复旦大学计算机科学与技术--网络空间安全方向,参营4天(6.26-6.29),管午饭,住宿自理6.26--报道+听会,6.27--听会+实验室参观给了一些专业方向和老师27号晚上会有一个小时的博弈时间,你可以看到每个方向有多少个人报名了,可以实时调整,紧张刺激,不过今年网安人

进度条小程序

0.前提知识缓冲区:在C/C++语言中,会针对标准输出,给用户提供默认的缓冲区,并且根据一定的机制进行刷新(或者用户自己刷新,比如:在输出缓冲区中使用fflush(stdout)就可以直接刷新输出缓冲区)。值得注意的是,这个缓冲区是语言给出的,而不是系统给出的。换行和回车:换行和回车是两回事,但是在C语言的换行符\n中

指针进阶(3)

9.模拟实现排序函数这里我们使用冒泡排序算法,模拟实现一个排序函数,可以排序任意类型的数据。这段代码可以排序整型数据,我们需要在这段代码的基础上进行改进,使得它可以排序任意类型的数据。#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>voidbubble_sort(inta

热文推荐