有小数为的number类型的乘法是怎么实现的呢?
遇到一个奇怪的问题
比如说:
1 * 1.1 结果是1.10
1 * 1.12结果是1.12
1 * 1.123结果是 1.1230
1 * 1.1234结果是 1.1234
上述结果是在游标中取得 直接返回给 vb.net vb转化为 decmial 在转化为字符串得到上述结果.
百思不得其解请高手指点.
遇到一个奇怪的问题
比如说:
1 * 1.1 结果是1.10
1 * 1.12结果是1.12
1 * 1.123结果是 1.1230
1 * 1.1234结果是 1.1234
上述结果是在游标中取得 直接返回给 vb.net vb转化为 decmial 在转化为字符串得到上述结果.
百思不得其解请高手指点.
SQL> create table test(id number);Table createdSQL> insert into test(id) values(1.1);1 row insertedSQL> commit;Commit completeSQL> select * from test; ID
----------
1.1SQL> drop table test;Table droppedSQL> create table test(id number(10,2));Table createdSQL> insert into test(id) values(1.1);1 row insertedSQL> select * from test; ID
------------
1.10SQL>
1 * 1.1 结果是1.10
1 * 1.12结果是1.12
1 * 1.123结果是 1.1230
1 * 1.1234结果是 1.1234
更崩溃的是
1*1.12345 的结果是 1.123450
如果是 补齐五个零 还说的过去,但是这个晕了就!
1 * 1.12结果是1.12
1 * 1.123结果是 1.1230
1 * 1.1234结果是 1.1234
1*1.12345 的结果是 1.123450 这个和number(9,5)没有多少关系, 你插入的是number 类型字段的值是 1.10 ,显示的当然是这个值了..
如果超出长度的话就四舍五入的自动截取了
你这个要看一下是不是 vb.net 那边转换了,在 oracle 数据库里,你定义 number(9.5)
你 1.123450 只会显示 1.12345, 1.123456 会显示成 1.12346
如果两个值都是 decmial 类型的 一个值是 1.123 另一个是1.1230 虽然表面去看都是 1.123D但是如果将其转化为字符串一个是"1.123"另一个是"1.1230"
所以可能是从Oracle取得值得时候 这两个值就已经不相同了.
Dim x As String = "123456789.1250 "
Dim x2 As String = "123456789.125 "
Dim x3 As String = "123456789.12500 "
Dim y1 As String = "1.5 "
Dim y2 As String = "1.6 " Dim y3 As String = "1 "
Dim y4 As String = "1.6 " Dim y5 As String = "1.000 "
Dim y6 As String = "1.6 " Dim y7 As String = "1.00 "
Dim y8 As String = "1.6 " k = 123456789.1256D
Console.WriteLine(k.ToString)
Console.WriteLine(Convert.ToDecimal(x).ToString())
Console.WriteLine(Convert.ToDecimal(x2).ToString())
Console.WriteLine(Convert.ToDecimal(x3).ToString()) Console.WriteLine((Convert.ToDecimal(y1) * Convert.ToDecimal(y2)).ToString()) Console.WriteLine((Convert.ToDecimal(y3) * Convert.ToDecimal(y4)).ToString())
Console.WriteLine((Convert.ToDecimal(y5) * Convert.ToDecimal(y6)).ToString())
Console.WriteLine((Convert.ToDecimal(y7) * Convert.ToDecimal(y8)).ToString())
结果: 123456789.1256
123456789.1250
123456789.125
123456789.12500
2.40
1.6
1.6000
1.600
很明显,你这个是 VB 的问题,和数据没有关系呀
这个是 VB 字符串与数值之间的转换了而且非常规律呀,结果的小数位数等于两个乘数的小数位数之和
不是的,ORACLE 返回来的已经是一个确定值了,vb.net只是将其进行了 object.tostring() 跟踪时发现这个object 的类型在vb.net中是 Decimal 类型.
然后上述代码我主要想说明的是:如果一个Decimal 变量值是1.1230 那么在tostring 后 他就是"1.1230"
如果他是这个"1.123" 那么在tostring 后 他就是"1.123"
所以说应该不是vb.net 动了手脚.
另外 小数部分偶数位是它不补零 奇数位时他补零.头疼,为啥呢?
y2=1.6
Console.WriteLine((Convert.ToDecimal(y1) * Convert.ToDecimal(y2)).ToString())
结果2.40,精度被.NET改变了。
不知道你的源码实现和测试代码是否完全一致,建议还是检查下.NET代码中的变量取值赋值和打印输出是否不小心改变精度了。
他就是做了个object.tostring 的事情