PLSQL 中的 REAL 数据类型

2024-04-30

SET SERVEROUTPUT ON;
DECLARE
A REAL := 123456789123456789123456789123456789123456789123456789123456789123456789;
BEGIN
DBMS_OUTPUT.PUT_LINE('A Value is : ' || A);
END;

上面的程序运行并给出了如下输出。

anonymous block completed
A Value is : 123456789123456789123456789123456789123500000000000000000000000000000000

有人可以解释一下为什么在第 40 位数字后显示 0 而不是实际值。第 40 位数字也是 5 而不是 4。


The SQL语言参考 http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm表示“REAL 数据类型是二进制精度为 63 或十进制 18 的浮点数”,显示为 FLOAT(63)。 FLOAT [(p)] 是:

NUMBER 数据类型的子类型,精度为 p。 FLOAT 值在内部表示为 NUMBER。精度 p 的范围可以是 1 到 126 个二进制数字。 FLOAT 值需要 1 到 22 个字节。

如果您创建一个包含 REAL 列的表,其行为类似于 FLOAT(63):

create table t42 (a real, b float(126), c float(63), d number);
insert into t42 (a, b, c, d)
values (123456789123456789123456789123456789123456789123456,
  123456789123456789123456789123456789123456789123456,
  123456789123456789123456789123456789123456789123456,
  123456789123456789123456789123456789123456789123456);

select a, b, c, d from t42;

                                                               A
----------------------------------------------------------------
                                                               B
----------------------------------------------------------------
                                                               C
----------------------------------------------------------------
                                                               D
----------------------------------------------------------------
             123456789123456789100000000000000000000000000000000 
             123456789123456789123456789123456789120000000000000 
             123456789123456789100000000000000000000000000000000 
             123456789123456789123456789123456789123000000000000

我使用了一个较小的值,因此它可以在 SQL*Plus/SQL Developer 的 numformat 49 位数字限制内显示。请注意,FLOAT(126) 和 NUMBER 值与该值并不完全相同。

PL/SQL 略有不同。在标准包中您可以看到:

  type NUMBER is NUMBER_BASE;
  subtype FLOAT is NUMBER; -- NUMBER(126)
  subtype REAL is FLOAT; -- FLOAT(63)

在 PL/SQL 块中REAL变量可以取任意值,不受限制NUMBER可以并且具有相同的比例/精度效果;在这种情况下只保留最重要的(38-40) http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm#sthref118数字,并将其余数字四舍五入为前 40 位数字中的最小数字。值的整体“大小”(作为 72 位数字)会被保留,但会失去超出 Oracle 内部格式所能存储的精度。如果您具有与表示例相同的变量类型并将原始值放入:

DECLARE
  A REAL := 123456789123456789123456789123456789123456789123456789123456789123456789;
  B FLOAT(126) := 123456789123456789123456789123456789123456789123456789123456789123456789;
  c FLOAT(63) := 123456789123456789123456789123456789123456789123456789123456789123456789;
  D NUMBER := 123456789123456789123456789123456789123456789123456789123456789123456789;
BEGIN
  DBMS_OUTPUT.PUT_LINE('A Value is : ' || A);
  DBMS_OUTPUT.PUT_LINE('B Value is : ' || B);
  DBMS_OUTPUT.PUT_LINE('C Value is : ' || C);
  DBMS_OUTPUT.PUT_LINE('D Value is : ' || D);
END;
/

A Value is : 123456789123456789123456789123456789123500000000000000000000000000000000
B Value is : 123456789123456789123456789123456789120000000000000000000000000000000000
C Value is : 123456789123456789100000000000000000000000000000000000000000000000000000
D Value is : 123456789123456789123456789123456789123500000000000000000000000000000000

请注意,这次不受限制的 FLOAT 和 NUMBER 显示相同的值,而受限制的 FLOAT 具有您期望的精度。

因此,它在第 40 位数字之后显示零,并且第 40 位数字是 5 而不是 4,因为您超出了精度,并且该值被四舍五入到最高有效数字。 SQL REAL 数据类型的精度为 63 位二进制或 18 位十进制;但除非指定,否则 PL/SQL REAL 与 NUMBER 匹配。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PLSQL 中的 REAL 数据类型 的相关文章

随机推荐

  • 在Eclipse中添加注释掉代码的快捷按钮

    只是想知道是否有一种方法可以在 Eclipse 编辑器中添加一个按钮 就像在 Visual Studio 中一样 在 Java 视图 中快速注释或取消注释选定的代码块 Using the keyboard shortcut isn t ea
  • React 中大括号的使用

    我正在尝试学习 React 我在使用花括号时遇到问题 JSX 和 JS 之间使用大括号的区别 在下面的代码中 大括号 1 表示 现在是 JS 为什么有花括号 2 它已经在花括号区域内了吗 var React require react va
  • 如何在 suave webpart 中设置 Json 响应

    我从 Suave 和 F 开始 我正在尝试在我的 web 部件中传递一个 json 序列化对象以在我的响应中获取它 在 php 中我有这个 player1Key hdegftzj25 gameKey aegfhzkfszl
  • Swift:如何在 UITableViewController(包含 UICollectionView)中使用“didSelectItemAtIndexPath”?

    我有一个UITableViewController 在 的里面TableViewCell 它是UICollectionView 我想传递来自CollectionViewCell to a DetailViewController当用户点击单
  • 为什么 localhost 不会在 chrome (OSX) 中路由到 127.0.0.1?

    当我使用 node debug 启动脚本时 它尝试导航到 URL localhost debug port 5858 但找不到那里提供的页面 如果我将 localhost 更改为 127 0 0 1 一切正常 我可以 ping localh
  • ELF 文件头

    关于 elf 文件头的一个简单问题 我似乎找不到任何关于如何在 elf 头中添加 更改字段的有用信息 我希望能够更改幻数并向标题添加构建日期 以及可能的其他一些内容 据我了解 链接器创建标头信息 但我在 LD 脚本中没有看到任何引用它的内容
  • onKeyEvent 和辅助服务

    我的用户将使用启用 TalkBack 的服务或其他一些无障碍服务 我想捕获我们应用程序中的 onKeyEvent 事件 但该事件被分派到启用的辅助功能服务 我创建了以下基本辅助服务 public class Accessibility Se
  • PHP - 外部类/库可以从 apache 访问,但不能从 phpunit 访问

    我在我的 Web 应用程序中使用 ZeroMQ 套接字库 我已经配置了 php ini 以便 Apache 可以使用 ZMQ 但我不知道 phpunit 如何使用它 phpunit 不使用与 apache 使用相同的 php ini 吗 在
  • 如何将 ZIP 文件从 API 管理上传到 Blob 存储

    我正在对我的 Azure Api 管理 API 之一发送 POST 请求 在此 post 请求中 有一个 json 正文 其中包含 base64 编码数据 zip 文件 如下例所示 foo 酒吧 数据 你的base64字符串 在 API 策
  • 具有多个绑定的ServiceHostFactory

    如何使用具有多个绑定的 ServiceHostFactory 这是我尝试过的方法 但我不断遇到问题 一个又一个错误 using System using System Collections Generic using System Lin
  • 获取表情符号字符的描述

    每个表情符号都有一个描述 您可以在 Mac 操作系统中看到 Space特殊字符选择器 有这里有他们的名单 http www grumdrig com emoji list 有没有办法让我在代码中查询此描述 无需将它们全部输入到结构中 我想做
  • 使用 C# 计算 HMACSHA256 以匹配支付提供商示例

    对于支付提供商 我需要使用 HMAC SHA256 计算基于哈希的消息身份验证代码 这给我带来了很大的麻烦 支付提供商以伪代码形式给出了两个正确计算验证码的示例 所有密钥均为十六进制 Method 1 key 57617b5d2349434
  • 如何在 Cocoa Touch 中验证网站证书?

    我目前使用 NSURLConnection 打开到 Web 服务器的 https 连接 一切正常 我能够检索我想要的页面内容 该证书是由 VeriSign 颁发的 我假设 NSURLConnection 做了一些工作来在某种程度上验证证书的
  • 在java中将对象声明为final

    有人可以澄清以下代码的意义吗 class A int i 10 public void setI int b i b public int getI return i class Test public static void main S
  • WinForms 应用程序中的初始化代码 - Program.cs 还是 MainForm?

    我有一个 Windows 窗体应用程序 当前在启动时加载数据库 流程是这样的 Program cs gt Application Run new MainForm gt MainForm 构造函数 gt 打开数据库 因此基本上 MainFo
  • 当我在 Xcode 4 中“构建存档”时,文件去了哪里?

    当我在 Xcode 4 中 构建存档 时 文件去了哪里 例如 存档的应用程序保存在我的计算机上的什么位置 Thanks 这取决于您的构建位置 请参阅 Xcode gt 首选项 gt 位置 请注意 构建存档 不会将您的工作存档在您输入的 存档
  • Laravel dusk chrome 驱动程序超时

    任何人都可以帮忙 我无法让 Laravel dusk 在 mac high Sierra 上当前的 Laravel 5 6 项目中运行默认示例测试 错误信息 时间 2 5 分钟 内存 14 00MB 有 1 个错误 1 测试 浏览器 Exa
  • 大虾PDF压缩,压缩内容流,它是做什么用的

    虾 gem 有一个初始化选项 compress 描述的是here http www rubydoc info github sandal prawn Prawn 2FDocument 3Ainitialize 显然它 Compresses
  • 多个文本视图还是一个具有可点击跨度的文本视图?

    我有一组模型 每个模型代表文本中的一个单词 它看起来像这样 ArrayList
  • PLSQL 中的 REAL 数据类型

    SET SERVEROUTPUT ON DECLARE A REAL 123456789123456789123456789123456789123456789123456789123456789123456789 BEGIN DBMS O