关于FLOAT8,decimal,NUMERIC类型字段的用法!

zhjian6 2005-09-26 08:32:59
我以前用的字段是:FLOAT8 后来不合用。
在各位大侠的建议下使用使用了,decimal,把FLOAT8全部转换为decimal(18,4)
但是问题就来了:以前FLOAT8从数据库中读到程序里直接可以加减乘除,现在decimal(18,4)读到程序就不可以直接加减乘除了!
我用的是ASP,用IsNumeric 函数测试从数据库中读出来的decimal(18,4)数据,发现不是数据类型!
再用VarType 函数一看,是 vbDecimal 14 十进制值 。
但是可以在程序里直接加减乘除的数据类型好像是:
vbInteger 2 整数
vbLong 3 长整数
vbSingle 4 单精度浮点数
vbDouble 5 双精度浮点数
我应该怎么办?
...全文
1450 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
rivery 2005-09-28
  • 打赏
  • 举报
回复
vbscript中数据类型定义:
每一个 Variant 子类型的取值范围如下:
子类型 值域
Byte 0 到 255。
Boolean True 或 False。
Integer -32,768 到 32,767。
Long -2,147,483,648 到 2,147,483,647。
Single 负数从 -3.402823E38 到 -1.401298E-45;正数从 1.401298E-45 到 3.402823E38。
Double 负数从 -1.79769313486232E308 到 -4.94065645841247E-324;正数从 4.94065645841247E-324 到 1.79769313486232E308。
Currency -922,337,203,685,477.5808 到 922,337,203,685,477.5807。
Date 公元 100 年 1 月 1 日到公元 9999 年 12 月 31 日(包括公元 100 年 1 月 1 日和公元 9999 年 12 月 31 日)。
Object 任何对象的引用。
String 可变长度字符串,字符串长度从 0 到大约 20 亿个字符。

转换类型函数说明:
CSng(expression)
expression 参数是任意有效的表达式。

说明
通常,可以使用子类型转换函数书写代码,以显示某些操作的结果应被表示为特定的数据类型,而不是默认类型。例如,在出现货币或整数运算的情况下,使用 CDbl 或 CSng 强制执行双精度或单精度运算。
CSng 函数用于进行从其他数据类型到 Single 子类型的国际公认的格式转换。例如,对十进制分隔符(如千分符)的识别取决于系统的区域设置。
CDbl(expression)
expression 参数是任意有效的表达式。

说明
通常,您可以使用子类型数据转换函数书写代码,以显示某些操作的结果应当被表达为特定的数据类型,而非默认的数据类型。例如在出现货币或整数运算的情况下,使用 CDbl 或 CSng 函数强制进行双精度或单精度算术运算。
CDbl 函数用于进行从其他数据类型到 Double 子类型的国际公认的格式转换。例如,十进制分隔符和千位分隔符的识别取决于系统的区域设置。

下面的示例利用 CDbl 函数把 expression 转换为 Double。

Dim MyCurr, MyDouble
MyCurr = CCur(234.456784) ' MyCurr 是 Currency 型 (234.4567)。
MyDouble = CDbl(MyCurr * 8.2 * 0.01) ' 把结果转换为 Double 型 (19.2254576)。

综上,你只能这样处理。且不会产生误差而造成的影响。
rivery 2005-09-28
  • 打赏
  • 举报
回复
误差肯定有(因为float是浮点型的)。但是一般没有多少影响。
我现在看到你前面的帖子了。明白你的意思。再看看有什么好办法。
zhjian6 2005-09-28
  • 打赏
  • 举报
回复
谢谢rivery(river)
select convert(float,decimal类型的列名) as 列名 from 表
这样了以后,会不会和以前 float 一样,数据会有误差?
rivery 2005-09-28
  • 打赏
  • 举报
回复
double类型->float类型
rivery 2005-09-28
  • 打赏
  • 举报
回复
(楼主所说的错误确实是存在的。)处理方法:

你在asp中将读出的数据转化一下。
变量=cdbl(rs(decimal类型的列名))

或者数据读出的时候将其转化为double类型.
select convert(float,decimal类型的列名) as 列名 from 表

已经过测试。可以做到。
zhjian6 2005-09-28
  • 打赏
  • 举报
回复
up
zhjian6 2005-09-27
  • 打赏
  • 举报
回复
up
tudou614 2005-09-26
  • 打赏
  • 举报
回复
学习下
zhjian6 2005-09-26
  • 打赏
  • 举报
回复
可能是语言上的问题,这种数据类型好像不能在ASP中直接加减乘除
把它转换成Double型就没问题了
vivianfdlpw 2005-09-26
  • 打赏
  • 举报
回复
应该不是数据类型方面的问题
检查一下你的代码
zhjian6 2005-09-26
  • 打赏
  • 举报
回复
Decimal 数据类型
Andy__Huang 2005-09-26
  • 打赏
  • 举报
回复
變量a是什麼數據類型?它的長度是多少?能不能夠空容得下decimal(18,4)這麼長的數據類型?

zhjian6 2005-09-26
  • 打赏
  • 举报
回复
比如
把decimal(18,4)数据赋给变量 a 不会出错
a=a+a  就出错!
Microsoft VBScript 运行时错误 错误 '800a000d'
类型不匹配
Andy__Huang 2005-09-26
  • 打赏
  • 举报
回复
你說不行到底是計算發生什麼錯誤嗎?能不能給出一些實際的數據?

类型类型描述 MYSQL_TYPE_TINY TINYINT字段 MYSQL_TYPE_SHORT SMALLINT字段 MYSQL_TYPE_LONG INTEGER字段 MYSQL_TYPE_INT24 MEDIUMINT字段 MYSQL_TYPE_LONGLONG BIGINT字段 MYSQL_TYPE_DECIMAL DECIMALNUMERIC字段 MYSQL_TYPE_NEWDECIMAL 精度数学DECIMALNUMERIC MYSQL_TYPE_FLOAT FLOAT字段 MYSQL_TYPE_DOUBLE DOUBLE或REAL字段 MYSQL_TYPE_BIT BIT字段 MYSQL_TYPE_TIMESTAMP TIMESTAMP字段 MYSQL_TYPE_DATE DATE字段 MYSQL_TYPE_TIME TIME字段 MYSQL_TYPE_DATETIME DATETIME字段 MYSQL_TYPE_YEAR YEAR字段 MYSQL_TYPE_STRING CHAR字段 MYSQL_TYPE_VAR_STRING VARCHAR字段 MYSQL_TYPE_BLOB BLOB或TEXT字段(使用max_length来确定最大长度) MYSQL_TYPE_SET SET字段 MYSQL_TYPE_ENUM ENUM字段 MYSQL_TYPE_GEOMETRY Spatial字段 MYSQL_TYPE_NULL NULL-type字段 MYSQL_TYPE_CHAR 不再重视,用MYSQL_TYPE_TINY取代 列类型存储需求 根据类别列出了MySQL支持的每个列类型的存储需求。 MyISAM表中行的最大大小为65,534字节。每个BLOB和TEXT列 账户只占其中的5至9个字节。 如果MyISAM表包括变长列类型,记录格式也是可变长度。当创建表时,在某些条件下,MySQL可以将一个列从变长类型改为固定长度的类型或反之亦然。详细信息参见13.1.5.1节,“沉寂的列规格变更”。 数值类型存储需求 列类型 存储需求 TINYINT 1个字节 SMALLINT 2个字节 MEDIUMINT 3个字节 INT, INTEGER 4个字节 BIGINT 8个字节 FLOAT(p) 如果0 <= p <= 24为4个字节, 如果25 <= p <= 53为8个字节 FLOAT 4个字节 DOUBLE [PRECISION], item REAL 8个字节 DECIMAL(M,D), NUMERIC(M,D) 变长;参见下面的讨论 BIT(M) 大约(M+7)/8个字节 DECIMAL(和NUMERIC)的存储需求与具体版本有关: 使用二进制格式将9个十进制(基于10)数压缩为4个字节来表示DECIMAL列值。每个值的整数和分数部分的存储分别确定。每个9位数的倍数需要4个字节,并且“剩余的”位需要4个字节的一部分。下表给出了超出位数的存储需求: 剩余的 字节 位数 数目 0 0 1 1 2 1 3 2 4 2 5 3 6 3 7 4 8 4 9 4 日期和时间类型的存储需求 列类型 存储需求 DATE 3个字节 DATETIME 8个字节 TIMESTAMP 4个字节 TIME 3个字节 YEAR 1个字节 字符串类型的存储需求 列类型 存储需求 CHAR(M) M个字节,0 <= M <= 255 VARCHAR(M) L+1个字节,其中L <= M 且0 <= M <= 65535(参见下面的注释) BINARY(M) M个字节,0 <= M <= 255 VARBINARY(M) L+1个字节,其中L <= M 且0 <= M <= 255 TINYBLOB, TINYTEXT L+1个字节,其中L < 28 BLOB, TEXT L+2个字节,其中L < 216 MEDIUMBLOB, MEDIUMTEXT L+3个字节,其中L < 224 LONGBLOB, LONGTEXT L+4个字节,其中L < 232 ENUM('value1','value2',...) 1或2个字节,取决于枚举值的个数(最多65,535个值) SET('value1','value2',...) 1、2、3、4或者8个字节,取决于set成员的数目(最多64个成员) VARCHAR、BLOB和TEXT类是变长类型。每个类型的存储需求取决于列值的实际长度(用前面的表中的L表示),而不是该类型的最大可能的大小。例如,VARCHAR(10)列可以容纳最大长度为10的字符串。实际存储需求是字符串(L)的长度,加上一个记录字符串长度的字节。对于字符串'abcd',L是4,存储需要5个字节。 对于CHAR、VARCHAR和TEXT类型,前面的表中的值L和M应解释为字符数目,并且列定义中的这些类型的长度表示字符数目。例如,要想保存一个TINYTEXT值需要L字符+ 1个字节。 要想计算用于保存具体CHAR、VARCHAR或者TEXT列值的字节数,需要考虑该列使用的字符集。在具体情况中,当使用Unicode时,必须记住所有Unicode字符使用相同的字节数。为了细分用于不同类Unicode字符使用的存储,参见10.5节,“Unicode支持”。 注释:VARCHAR列的有效最大长度为65,532字符。 NDBCLUSTER引擎只支持固定宽度的列。这说明MySQL簇中的表中的VARCHAR列的行为如同类型CHAR(不同的是每个记录仍然有一个额外字节空间)。例如,在Cluster表中,声明为VARCHAR(100)的列中的每个记录存储时将占用101个字节,无论实际存储的记录中的字符串的长度为多少。 BLOB和TEXT类需要 1、2、3或者4个字节来记录列值的长度,取决于该类的最大可能的长度。参见11.4.3节,“BLOB和TEXT类型”。 在NDB Cluster存储引擎中,TEXT和BLOB列的实施是不同的,其中TEXT列中的每个记录由两个单独部分组成。一个是固定大小(256字节),并且实际上保存在原表中。另一个包括超出256字节的任何数据,保存在隐含的表中。第2个表中的记录总是2,000字节长。这说明如果size<= 256,TEXT列的大小为256(其中size表示记录的大小);否则,大小是256 +size+(2000–(size–256)%2000)。 ENUM对象的大小由不同的枚举值的数目确定。枚举用一个字节,可以有255个可能的值。当枚举的值位于256和65,535之间时,用两个字节。参见11.4.4节,“ENUM类型”。 SET对象的大小由不同的set成员的数量确定。如果set大小是N,对象占(N+7)/8个字节,四舍五入到1、2、3、4或者8个字节。SET最多可以有64个成员。参见11.4.5节,“SET类型”。

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧