首页 新闻 搜索 专区 学院

20位长度的数字比较大小

0
悬赏园豆:100 [已解决问题] 解决于 2018-05-09 23:34

parseInt取整,长度超过18位,末尾都成0了,所以,当长度为20位时,实行前10位进行切割,分别比较。

比如给定数字范围【-12345678912345678912-12345678912345678912】,我如何判定我给定的数字value在不在这个范围?

问题补充:

对于parseInt和parseFlaot,有一定的长度限制

月牙天缺的主页 月牙天缺 | 初学一级 | 园豆:-3
提问于:2017-02-12 21:50
< >
分享
最佳答案
0

JS的情况:

12345678912345678912 < 12345678912345678910
false
12345678912345678912 > 12345678912345678910
false

1234567891234568 < 1234567891234560
false
1234567891234568 > 1234567891234560
true

 

像楼上几位说的,超过16位,先当作字符串处理,截取16位出来后,就可以做数字比较了。

收获园豆:100
junio.cn | 菜鸟二级 |园豆:445 | 2017-02-19 23:07
其他回答(10)
0

就别取整了.你直接百度:大整数对比大小

吴瑞祥 | 园豆:28820 (高人七级) | 2017-02-12 23:34
0

采用二进制的想法,比如你这个大整数是64位,int存32位。你可以选择用一个char数组或者一个long保存大整数,然后从高位到地位(或者从低位到高位)每一个int放入int整数中,然后从高位开始比较。

Boblim | 园豆:492 (菜鸟二级) | 2017-02-13 09:38
0

js-BIO 是一个在 JavaScript 中对大整数进行常用算术运算的类库。比如可以相减看是否大于零,点击测试

无影飞絮剑 | 园豆:1155 (小虾三级) | 2017-02-13 10:13
0

Long,注意是大写的封装类

CaiYongji | 园豆:1267 (小虾三级) | 2017-02-13 10:42
0

"12345678901234567890".length

20

使用长度判断大小吧,parseInt的字符串长度超过16就不对了

parseInt("12345678901234567");
12345678901234568
parseInt("1234567890123456");
1234567890123456

鱼鱼鱼 | 园豆:160 (初学一级) | 2017-02-13 11:41
0

BigDecimal  用这个   

http://zhangyinhu8680.iteye.com/blog/1536397

_zpq | 园豆:204 (菜鸟二级) | 2017-02-13 14:40
0

楼主,这是我写的C#代码,可以参考一下改成js代码

/// <summary>
/// 将字符串数字乘一个小于10的数字
/// </summary>
/// <param name="num">小于</param>
/// <param name="str"></param>
/// <returns></returns>
string strCF(byte num, string str)
{
if (num > 9) throw new Exception("请不要传递大于9的数字!");
else if (num == 0) return "0";
else if (num == 1) return str;
List<char> result = new List<char>();
str = string.Join("", str.Reverse());
for (int i = 0; i < str.Length; i++)
{
byte b = Convert.ToByte(str[i].ToString());
b *= num;
if (result.Count - 1 == i)
{
b += Convert.ToByte(result[i].ToString());//加上原来数据
result.RemoveAt(i);
}
result.AddRange(b.ToString().Reverse());
}
result.Reverse();
if (result.All(c => c.Equals('0'))) result = new List<char>() { '0' };
return string.Join("", result);
}
/// <summary>
/// 字符串加法
/// </summary>
/// <param name="num1"></param>
/// <param name="num2"></param>
/// <returns></returns>
string strAdd(string num1, string num2)
{
List<char> result = new List<char>();
num1 = string.Join("", num1.Reverse());
num2 = string.Join("", num2.Reverse());
int len = num1.Length < num2.Length ? num1.Length : num2.Length;
for (int i = 0; i < len; i++)
{
byte b = Convert.ToByte(int.Parse(num1[i].ToString()) + int.Parse(num2[i].ToString()));
if (result.Count - 1 == i)
{
b += Convert.ToByte(result[i].ToString());//加上原来数据
result.RemoveAt(i);
}
result.AddRange(b.ToString().Reverse());
}
if (num1.Length != num2.Length)
{
string last = (num1.Length > num2.Length ? num1 : num2).Substring(len);
if (result.Count != len)
{//不管怎么加最多只可能进1
int lastNum = int.Parse(last[0].ToString()) + int.Parse(result.Last().ToString());
if (lastNum < 10)
last = lastNum + last.Substring(1);
else
last = string.Join("", strAdd(string.Join("", last.Reverse()), result.Last().ToString()).Reverse());

result.RemoveAt(result.Count - 1);
}
result.AddRange(last);
}
result.Reverse();
if (result.All(c => c.Equals('0'))) result = new List<char>() { '0'};
return string.Join("", result);
}
/// <summary>
/// 字符串减法
/// </summary>
/// <param name="num1"></param>
/// <param name="num2"></param>
/// <returns></returns>
string strSubtract(string num1, string num2)
{
List<char> result = new List<char>();
if (num1.Length >= num2.Length)
{
num1 = string.Join("", num1.Reverse());
num2 = string.Join("", num2.Reverse());
int len = num1.Length;
for (int i = 0; i < len; i++)
{
short b = Convert.ToInt16(int.Parse((num1.Length > i ? num1[i] : '0').ToString()) - int.Parse((num2.Length > i ? num2[i] : '0').ToString()));
if (b < 0)
{
if (i == len - 1) //最后一次还需要借位的话
{
num1 = Math.Abs(b).ToString();
for (int j = 0; j < result.Count; j++)
num1 = num1 + "0";
return "-" + strSubtract(num1, string.Join("", result));
result.AddRange(b.ToString().Reverse());
}
b += 10;
num2 = num2.Substring(0, i + 1) + string.Join("", strAdd(string.Join("", num2.Substring(i + 1).Reverse()), "1").Reverse());
len = num1.Length > num2.Length ? num1.Length : num2.Length;
}
result.AddRange(b.ToString().Reverse());
}
}
else
//if (num1.Length < num2.Length)
return "-" + strSubtract(num2, num1);
//else
//{ //位数相等
// int i = 0, b;
// do
// {
// b = int.Parse((num1.Length > i ? num1[i] : '0').ToString()) - int.Parse((num2.Length > i ? num2[i] : '0').ToString());
// if (b > 0) return strSubtract("0" + num1, num2);
// else if (b < 0) return "-" + strSubtract("0" + num2, num1);
// } while (b == 0);
//}
//if (num1.Length != num2.Length)
//{
// string last = (num1.Length > num2.Length ? num1 : num2).Substring(len);
// if (result.Count != len)
// {//不管怎么加最多只可能进1
// //但是49+1之类的情况就会出现问题
// int lastNum = int.Parse(last[0].ToString()) + int.Parse(result.Last().ToString());
// if (lastNum < 10)
// last = lastNum + last.Substring(1);
// else
// last = string.Join("", strAdd(string.Join("", last.Reverse()), result.Last().ToString()).Reverse());

// result.RemoveAt(result.Count - 1);
// }
// result.AddRange(last);
//}
result.Reverse();
if (result.All(c => c.Equals('0'))) result = new List<char>() { '0' };
return string.Join("", result);
}
/// <summary>
/// 字符串乘法
/// </summary>
/// <param name="num1"></param>
/// <param name="num2"></param>
/// <returns></returns>
string strCF(string num1, string num2)
{
string result = "0";
if (num1.Length <= num2.Length)
{
num1 = string.Join("", num1.Reverse());
foreach (char item in num1)//优化算法逻辑 把乘数的一端的0移到另一端
{
if (item != '0') break;
else
{
num1 = num1.Substring(1);
num2 = num2 + "0";
}
}
for (int i = 0; i < num1.Length; i++)
{
string b0 = "";
for (int j = 0; j < i; j++)
b0 += "0";
result = strAdd(result, strCF(Convert.ToByte(num1[i].ToString()), num2 + b0));
}
}
else return strCF(num2, num1);//反过来调用 加快运行速度减少循环次数
return result;
}

自强不息的sun | 园豆:111 (初学一级) | 2017-02-13 18:07

注释是旧的,所有算法应该都是没问题的。如果逻辑上有不理解的地方可以问我。我的大致思路是把字符串翻转符合正常计算逻辑,然后进行数学逻辑运算。

支持(0) 反对(0) 自强不息的sun | 园豆:111 (初学一级) | 2017-02-13 18:09

博主,如果你是要计算的话,可以考虑像这样字符串加减做个一套出来,也不复杂,如果是简单比较大小,楼下的思路就挺容易。

首先判断两个字符串的正负号,正数肯定大于负数,同号就判断长度,正数长的大,负数长的小,再其次位数相同就要逐位循环比较了

支持(0) 反对(0) 自强不息的sun | 园豆:111 (初学一级) | 2017-02-14 10:08
0

你要在前端比较的话,首先比较长度,长度一样则比较第一个,第二个.......

【秦时明月】 | 园豆:803 (小虾三级) | 2017-02-13 19:25
0

一般都是 分割之后保存为数组 再按顺序比较吧

hobotree | 园豆:206 (菜鸟二级) | 2017-02-16 11:32
0

数据库中就比较好处理 直接先长度 然后字符排序应该就可以了

不是数据库也是 可以先比较长度 然后从高到底 逐个比较

小眼睛老鼠 | 园豆:2774 (老鸟四级) | 2017-03-07 14:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册