大家好,这太荒谬了..
因为我试图调试我发现:就像我输入
Dim value As Double value = 0.90000然后按Enter键
它自动转换0.9
不应该在Visual Basic中保持精度为双倍?
对于我的计算,我绝对需要显示精度:(
谢谢!
答案 0 :(得分:2)
如果需要精度,那么Currency
数据类型就是你想要使用的。
答案 1 :(得分:2)
您的价值至少有两种表现形式。一个是你在屏幕上看到的值 - 一个字符串 - 一个是内部表示 - 一个二进制值。在处理小数值时,这两个通常不相等,而它们不是等价的,这是因为它们不可能。
如果坚持使用双打,VB将在整个计算过程中保持53位尾数,无论打印时它们如何显示。如果您通过字符串域进行转换,比如通过保存到文件或数据库并稍后进行检索,则通常必须保留一些精度。这是不可避免的,因为两个域之间的接口并不完美。一些可以精确表示为字符串的值(或十进制数,即10的幂)不能精确地表示为2的分数幂。
这与VB无关,它是浮点数的本质。您可以做的最好的事情是控制舍入发生的位置。为此,您的朋友是格式函数,它控制值以字符串形式出现的方式。
?格式$(0.9,“0.00000”)将显示一个示例。
答案 2 :(得分:2)
您在屏幕上看到的内容与Double中设置的内容相混淆,无法显示该数字。
VB只是“有用”,只是简单地敲掉多余的零。但是出于所有意图和目的,
0.9
与
相同0.90000
如果您不相信我,请尝试进行此比较:
Debug.Print CDbl("0.9") = CDbl("0.90000")
如前所述,可以使用Format $()函数显示显示的精度,例如
Debug.Print Format$(0.9, "0.00000")
答案 3 :(得分:1)
不,它不应该保持精确度。二进制浮点值不保留这些信息......这样做有点奇怪,因为你在一个基数中表达了值,即使它在另一个基数中表示。
我不知道VB6是否有十进制浮点类型,但这可能是你想要的 - 或者是一个固定点十进制类型。当然在.NET中,System.Decimal
从.NET 1.1开始保留了额外的0。如果这对你没有帮助,你可以考虑记住两个整数 - 例如在这种情况下,“90000”和“100000”,以便您表示的值是一个整数除以另一个整数,以及相关的精度水平。
编辑:我认为Currency
可能是你想要的,但是according to this article,它固定在4位小数,你试图保留5.你可能只乘以10,如果你总是想要5个小数位 - 但记住在任何地方做这件事是个尴尬的事情......而且你必须弄清楚如何适当地格式化它。我怀疑,它也总是是4位小数,即使你指定的更少 - 所以如果你想让“0.300”与“0.3000”不同,那么Currency
可能不是适当。我完全基于在线文章,但是......
答案 4 :(得分:0)
您也可以输入值 0.9#。这有助于避免表达式中的隐式强制,这可能会截断您期望的精度。在大多数情况下,编译器不会要求此提示,因为浮点文字默认为Double(实际上,IDE通常会删除#符号,除非该值是整数,例如 9#)。
对比这些结果:
MsgBox TypeName(0.9)
MsgBox TypeName(0.9!)
MsgBox TypeName(0.9@)