我在程序中用到了Math.Log()这个求对数的方法,现在出现一个无法理解的问题:Math.Log(8,2); //结果是正确的值:3
(int)Math.Log(8,2); //结果竟是2 ???
Math.Floor(Math.Log(8,2)); //也是2 ??用其它数值测试均没有上面碰到的这种问题,比如(int)Math.Log(4,2)和Math.Log(4,2)结果都是2,Math.Log(16,2)和 (int)Math.Log(16,2) 结果都是4,Math.Log(32,2)和(int)Math.Log(32,2)结果都是5,只有(int)Math.Log(8,2)或Math.Floor(Math.Log(8,2));输出的值不正确,百思不得其解,在同事的机器上测试结果也一样,应该不是机器的问题了,难道是.net的bug?或是别的什么原因?有谁碰到过这个问题吗?
(int)Math.Log(8,2); //结果竟是2 ???
Math.Floor(Math.Log(8,2)); //也是2 ??用其它数值测试均没有上面碰到的这种问题,比如(int)Math.Log(4,2)和Math.Log(4,2)结果都是2,Math.Log(16,2)和 (int)Math.Log(16,2) 结果都是4,Math.Log(32,2)和(int)Math.Log(32,2)结果都是5,只有(int)Math.Log(8,2)或Math.Floor(Math.Log(8,2));输出的值不正确,百思不得其解,在同事的机器上测试结果也一样,应该不是机器的问题了,难道是.net的bug?或是别的什么原因?有谁碰到过这个问题吗?
解决方案 »
- c#文本框限制输入
- 使用Webbroser设置input属性的问题
- 求教Delphi代码转C#这么写
- 如何在长度100的字符串中找出是否有数字??
- 连接SQLSERVER2005的时候报错,请问是怎么回事.
- 困惑了三天!未将对象引用设置到对象的实例。???
- c#類中定義屬性問題
- c#.net“未将对象引用设置到对象的实例”问题怎么解决?谢谢回复!
- 版主接招!!我买了大本营3.0(。NET开发),可是那个离线浏览器为何只能下载7月份已前的数据???
- 我现在正在全力学习C#,但对于C#中的“在类中实现事件”我理解的不是很清楚,如下面这段代码我看的非常吃力,谁知道哪里有“C#事件”这方
- 用微软的treeview的时候遇到的问题:左边用的treeview,右边是对应的连接,但是在点击treeview节点展开的时候
- 请问使用iTextSharp 3.0.10能否正确读出rtf文件件的文本内容?怎样做?
(int)Math.Log(8,2) = 2
Convert.ToInt32(Math.Log(8,2)) = 3 还真奇怪了,呵呵,关注
int.Parse(Math.Log(8,2).ToString())却返回正确的3又该如何解释呢?
试过了,完全一样,就是这个:
(int)((double)Math.Log(8,2))结果还是2
和1-0.9-0.1<>1-0.1-0.9一样
记得以前VB6里 cint(0.5)=0 cint(1.5)=2 cint(2.5)=2,也是同样的问题
计算机本身的问题,VS里没有很好的处理,尽量避免这样使用吧
int k=(int)Math.Log(8,2);
double l=Math.Floor(Math.Log(8,2));
Console.Read();
我在VS2003里面得到的是正确答案啊,都是3.怎么回事哦?!
不过浮点数转int最好不用(int),因为就算最简单的1+1做多了,结果也会变成不是整数的,总会多一点或者少一点突然想到一点,你先转decimal再转int看看
[Test]
public void ATest()
{
double b=Math.Log(8,2); //这里设了断点
Assert.AreEqual((int)b,3);
}在断点中能看出变量b=3.0,但测试结果却失败了:
expected: <2>
but was: <3>
public void ATest()
{
double b=2.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999;
Assert.AreEqual((int)b,3);
}1 succeeded, 0 failed, 0 skipped, took 0.09 seconds.
不对的,double最多精度是16位double
±5.0 × 10−324 到 ±1.7 × 10308
15 到 16 位
System.Double
可以用Math.Floor ...
double d = 2.999999999999999; 一共16位,也就是double的精度极限
int i = (int)d;
int j = Convert.ToInt32(d);
MessageBox.Show(d.ToString() + "\n" + i.ToString() + "\n" + j.ToString());显示的是3 2 3再多一个9就是3 3 3了
public static double Log(double a, double newBase)
{
return (Math.Log(a) / Math.Log(newBase));
}
大家一看问题出在哪了,我们其实可以这样做:
Decimal m = Convert.ToDecimal(Math.Log( 8 ));
Decimal n = Convert.ToDecimal(Math.Log( 2 ));
Console.WriteLine( Convert.ToDecimal(m / n ));
Console.WriteLine( (Math.Log(8) / Math.Log(2)));
^-^
(int)Math.Log(8,2); //结果3
Math.Floor(Math.Log(8,2)); //结果3.0莫得楼主说的问题啊....
Math.Floor()试过,和显式转换为int是一样的to tiaoci(我挑刺,我快乐):
小弟非科班出身,初中毕业而已,编程技术是自学的,也没研究过计算机太基础的东西,露拙了别见笑:)谢谢各位参与,现在只有用raulredondo() 所说的先转为decimal然后再转为int的方法了,结帖!