`
buliedian
  • 浏览: 1243825 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

powerbuilder Decimal内部表示方式解析

阅读更多

Decimal是16bytes数据类型。最大精度18位。

如果申明时写:dec var1 = xxx,它内部初始值会自动设置精度:

000014d9h: 01 00 08 00 F6 FF 09 00 00 00 00 00 00 00 B8 00 dec{8} q111111111111111111 = -0.0065535
000014d9h: 01 00 0C 00 60 79 9E 86 01 00 00 00 00 00 B8 00 dec{12} q111111111111111111 = -0.0065535
000014c9h: 01 00 00 00 FF FF 00 00 00 00 00 00 00 00 B8 00 dec q111111111111111111 = -65535
000014d9h: 01 00 01 00 FF FF 00 00 00 00 00 00 00 00 B8 00 dec q111111111111111111 = -6553.5
000014d9h: 01 00 02 00 FF FF 00 00 00 00 00 00 00 00 B8 00 dec q111111111111111111 = -655.35
000014d9h: 01 00 03 00 FF FF 00 00 00 00 00 00 00 00 B8 00 dec q111111111111111111 = -65.535
000014d9h: 01 00 04 00 FF FF 00 00 00 00 00 00 00 00 B8 00 dec q111111111111111111 = -6.5535
000014d9h: 01 00 05 00 FF FF 00 00 00 00 00 00 00 00 B8 00 dec q111111111111111111 = -0.65535
000014d9h: 01 00 06 00 FF FF 00 00 00 00 00 00 00 00 B8 00 dec q111111111111111111 = -0.065535
000014d9h: 01 00 07 00 FF FF 00 00 00 00 00 00 00 00 B8 00 dec q111111111111111111 = -0.0065535
000014d9h: 01 00 08 00 FF FF 00 00 00 00 00 00 00 00 B8 00 dec q111111111111111111 = -0.00065535

由上的hex可见,dec申明时系统决定精度,最大可能满足最好的保存方式。

而dec{8}的方式如果赋值长度超过,将被截取掉。

pbkiller有2个bug,一是没处理正负号,二是小于1的小数,它一直是保持小数点不动,也就是没处理指数(仅仅小于1的情况下,大于1的情况有处理ok)。

内部的二进制表示上看,低2位表示正负号,目前只使用了1bit,3-4位表示精度。4-12是以一个__int64表示的极大整数

为了解析这个decimal格式,整整花了一天时间。pb的real对应c++的float,double对应c++的double。

iGetLen = 8;
longlongValue=0;
memcpy(&longlongValue,pDataResLocal + iDataOrPoint + 4,iGetLen);
sReturn = IntToStr(longlongValue);

//指数部分;如果申明dec var1,这个精度是根据赋值时自动进行的。
//原则是尽可能保存完整。但是如果申明dec{8} var1,这精度是固定的。
//给小数点
inttemp = sReturn.Length(); //长度不要变动,后面给指数时还用到。
if (inttemp >1){
sReturn = sReturn.SubString(1,1) + "." +
sReturn.SubString(2,inttemp - 1);
}

//去掉尾部的多余0
intValue = inttemp + 1; //小数点;
while(intValue>3){
if(sReturn.SubString(intValue,1) == "0"){
intValue --;
if(intValue < 4) break;
}else{
break;
}
}
sReturn = sReturn.SubString(1,intValue);

//变更指数
iGetLen = 2;
intValue = 0;
memcpy(&intValue,pDataResLocal + iDataOrPoint + 2,iGetLen);
if (intValue - inttemp + 1 !=0){
sReturn +="E" + IntToStr(-(intValue - inttemp + 1));
}

//处理正负号
iGetLen = 1;
intValue = 0;
memcpy(&intValue,pDataResLocal + iDataOrPoint,iGetLen);

if(intValue){
sReturn = "-" + sReturn;
}

break;

程序demo:

//
dec{8} q1 = -123.44320123
dec{8} q11 = 0.01
dec{8} q12 = 0.001
dec{8} q13 = 0.0001
dec{8} q14 = 0.00001
dec{8} q15 = 0.000001

dec{8} q16 = 3.14E-5
dec{8} q17 = 6500000000

dec{0} q2= 3.1415926514159265141592651415926514159265 //仅供测试系统的截取情况

dec{4} q3= 3.1415926514159265141592651415926514159265
dec{8} q4= 3.1415926514159265141592651415926514159265
dec{12} q5= 3.1415926514159265141592651415926514159265
dec{16} q6= 3.1415926514159265141592651415926514159265

dec{18} q7= 3.1415926514159265141592651415926514159265

any r1 = 3.1415926514159265141592651415926514159265

pbkiller结果:

decimal q1 = 123.44320123
decimal q11 = .1000000 //here error
decimal q12 = .100000//here error
decimal q13 = .10000 //here error
decimal q14 = .1000 //here error
decimal q15 = .100 //here error
decimal q16 = .3140//here error
decimal q17 = 6500000000.00000000
decimal q2 = 3
decimal q3 = 3.1416
decimal q4 = 3.14159265
decimal q5 = 3.141592651416
decimal q6 = 3.1415926514159265
decimal q7 = 3.141592651415926514
decimal r1 = 3.141592651415926514

我的decomplier:

global <FUNCTION_OR_SUBRUNTINE> <RETURN_DATATYPE> lf_111(<PARAM_LIST>) <THROWS_OBJNAME>
//Variables List
dec{8}q1 = -1.2344320123E2
dec{8}q11 = 1.0E-2
dec{8}q12 = 1.0E-3
dec{8}q13 = 1.0E-4
dec{8}q14 = 1.0E-5
dec{8}q15 = 1.0E-6
dec{8}q16 = 3.14E-5
dec{8}q17 = 6.5E9
dec{0}q2 = 3
dec{4}q3 = 3.1416
dec{8}q4 = 3.14159265
dec{12}q5 = 3.141592651416
dec{16}q6 = 3.1415926514159265
dec{18}q7 = 3.141592651415926514
decr1 = 3.141592651415926514
还算满意。

分享到:
评论

相关推荐

    PowerBuilder程序开发规范

    ### PowerBuilder程序开发规范详解 #### 一、系统对象的命名规范 在PowerBuilder的程序开发中,系统对象的命名规范至关重要,它不仅有助于代码的可读性和维护性,还能提高团队协作效率。以下是PowerBuilder中各类...

    powerbuilder命名规则

    - **pfcobject**:该部分用来标识对象的级别,如果使用 `PFC_` 前缀,则表示为 PFC(PowerBuilder Function Class)级别;如果不使用 `PFC_` 前缀,则默认为 PFE(PowerBuilder Function Extension)级别。 - **type...

    PowerBuilder 函数全包括

    ### PowerBuilder 函数详解 #### 1. Abs() **功能说明**:此函数用于计算一个数值型变量或表达式的绝对值。 **语法格式**:Abs ( n ) **参数说明**: - **n**:需要计算绝对值的数值型变量或表达式。 **返回值*...

    PowerBuilder 手写笔记

    1. 标准数据类型:PowerBuilder提供了多种基本数据类型,如string用于存储字符串,char用于存储单个字符,boolean用于逻辑判断,integer是16位带符号整数,decimal是带有18位有效数字的小数,real是浮点型,double是...

    pb字符串转十六进制及各进制之间转换源码

    PowerBuilder作为一款老牌的客户端/服务器应用程序开发工具,提供了丰富的功能,包括字符串处理和数据类型转换。本篇将详细介绍如何在PowerBuilder 9中进行字符串转十六进制以及不同进制之间的转换。 在Power...

    PB手册【2022】.pdf

    PB手册是PowerBuilder开发中不可或缺的参考手册,本文档将对PB手册中的变量类型命名规则、开发规范、变量访问权限、注释等知识点进行详细的解释和总结。 变量类型命名规则 在PowerBuilder中,变量类型命名规则是...

    PowerBuilder应用程序在SQL Anywhere数据库中动态创建表的方法.pdf

    通过这种方式,PowerBuilder应用程序能够在运行时根据需要动态地在SQL Anywhere数据库中创建表,从而提高了系统的灵活性和适应性。这种方法在处理不确定数据结构或需要频繁调整表结构的应用中尤为适用。

    powerbuilder用语音读金额

    ### PowerBuilder 中实现语音读取金额的技术解析 #### 核心知识点概述 本文将详细介绍如何在PowerBuilder(简称PB)环境中实现将金额数值通过语音读出的功能。此功能的实现主要包括两个步骤:首先将金额数值转换为...

    《PowerBuilder数据库应用开发》练习题.pdf

    《PowerBuilder数据库应用开发》练习题涵盖了多个基本的编程概念,包括用户界面设计、数据类型转换、条件判断、循环逻辑以及数值计算。以下是对每个练习题的详细解释: 1. 练习题1:该题旨在创建一个计算圆的周长和...

    python中的decimal类型转换实例详解

    Decimal对象可以精确地表示任何数值,并且可以限制有效数字的数量,这对于财务和科学计算非常有用。 #### 三、Decimal类型的创建 ##### 1. 从整数创建 ```python import decimal d = decimal.Decimal(5) # ...

    decimal date转换_date转decimal_decimal转date_decimal转date_timeconver

    这种表示方式通常用于科学计算或在特定编程环境中。下面我们将详细讨论这个主题,包括`date转decimal`、`decimal转date`以及`decimal转date_timeconvert`的相关知识点。 1. **Date转Decimal**: - 将日期转换为小数...

    pb9.0调用c#dll

    PowerBuilder(简称PB)9.0是一款老牌的面向对象的客户端/服务器(client-server)应用程序开发工具,它以其强大的数据窗口功能而闻名。C#,另一方面,是.NET框架下的现代编程语言,具有丰富的类库和优秀的性能。本...

    DECIMAL 功能开发文档1

    《DECIMAL功能开发文档》详细解析 在数据库系统中,数据类型是至关重要的组成部分,它们决定了数据的存储方式和处理规则。本文档主要探讨的是在Cedar数据库中添加对DECIMAL数据类型的支撑,以满足对高精度数值计算...

    Go-decimal-任意精度的定点小数

    这是因为浮点数在计算机中的表示是近似值,而非精确值。为了解决这个问题,"decimal"库应运而生,它实现了任意精度的定点小数,可以进行完全精确的数学运算。 "decimal"库的主要特性包括: 1. **任意精度**:它支持...

    前端项目-decimal.js.zip

    例如,`new Decimal('3.14')` 创建了一个表示π的Decimal对象。 3. **算术运算**:Decimal.js支持所有基本的数学运算,包括加法(+)、减法(-)、乘法(*)、除法(/)、指数(pow)等,并且保证了结果的精度。 4...

    pb数字进制间相互转化(源码).zip

    本压缩包"pb数字进制间相互转化(源码)"提供了在PowerBuilder中实现不同进制之间转换的源代码,包括十六进制(Hexadecimal)、十进制(Decimal)和二进制(Binary)之间的转换。以下是这些转换方法的详细解释: 1. *...

    decimaljsJavaScript的任意精度Decimal类型

    Decimal.js 是一个专门为JavaScript设计的高精度数字计算库,它主要解决了JavaScript中浮点数运算精度丢失的问题。在JavaScript中,由于其内置的Number类型使用的是双精度浮点数(IEEE 754),在进行大数值或者高...

    decimal数据类型的小结

    例如,`decimal(5,2)`表示一个最多可以有5位数字,其中包含2位小数的十进制数值。 ### `decimal`数据类型的特性 1. **精度控制**:`decimal`类型能够提供比`float`或`double`更高的精度,这对于需要精确到分、厘的...

    详解MySQL数据类型DECIMAL(N,M)中N和M分别表示的含义

    MySQL中的DECIMAL数据类型用于存储高精度的十进制数,它在数据库设计中尤其重要,因为这种数据类型可以确保精确存储货币和其他需要精确计算的数值。标题和描述提到的"DECIMAL(N,M)"中,N和M是两个关键参数,它们定义...

Global site tag (gtag.js) - Google Analytics