Javascript 将整数分成两(几乎)相等的部分

Javascript 将整数分成两(几乎)相等的部分,javascript,math,Javascript,Math,我需要把一个整数分成两个数。类似于除以2,但我只希望得到整数组件,例如: 6 = 3 and 3 7 = 4 and 3 我尝试了以下方法,但我不确定这是最好的解决方案 var number = 7; var part1 = 0; var part2 = 0; if((number % 2) == 0) { part1 = number / 2; part2 = number / 2; } else { part1 = parseInt((number / 2) +

我需要把一个整数分成两个数。类似于除以2,但我只希望得到整数组件,例如:

6 = 3 and 3
7 = 4 and 3
我尝试了以下方法,但我不确定这是最好的解决方案

var number = 7;
var part1 = 0;
var part2 = 0;

if((number % 2) == 0) {
    part1 = number / 2;
    part2 = number / 2;
}
else {
    part1 = parseInt((number / 2) + 1);
    part2 = parseInt(number / 2);
}
这正是我想要的,但我认为这段代码并不干净


有更好的方法吗?

只需找到第一部分,然后从原始数字中减去它

var x=7;
变量p1=数学楼层(x/2);
var p2=x-p1;

控制台日志(p1,p2)您的代码可以简化一点:

var num=7;
变量p1=数学楼层(num/2);
var p2=p1;
如果(数量%2!=0){
p1++;
}
控制台日志(p1,p2)让javascript为您做些什么

var x=7;
变量p1=数学单元(x/2);
变量p2=数学楼层(x/2);
控制台日志(p1,p2)或者这样:)

var编号=7;
var part1=~((数字/2)+(数字%2));
var part2=~(number/2);
控制台日志(第1部分,第2部分)
var num=7;
var part1=parseInt(num/2);
var part2=num-part1;
控制台日志(第1部分,第2部分)
var x=11;
var a=数学单元(x/2);
var b=x-a;

console.log(“x=“+x+”,a=“+a+”,b=“+b”)如果您不希望输出是相同的或完全相同的,但又想“将一个整数分成两个数字”,那么这就是您的解决方案:

函数printSeparatedInts(num){
设smallerNum=Math.floor(Math.random()*Math.floor(num));
如果(num&&smallerNum==(num/2)){//检查输入!=0&输出是否不连续
打印分离数(num)
}否则{
log(smallerNum,(num-smallerNum))
}
}
印刷品(22)
printSeparatedInts(22)//可能会打印与上面不同的输出

printSeparatedInts(7)
另一种方法是使用位运算符。它不适用于非常大的数字

函数拆分器(编号){
第1部分=(数字>>1)+(数字和1);
第2部分=编号>>1;
日志(编号+“:”,第1部分+“+”+第2部分);
}
分离器(7);
分离器(6);
拆分器(2**30+1);//大于2**31的值的中断
分离器(2**31+1)感觉懒惰?没问题!
我自豪地向您展示一个生成器对象

初始化它并使用它即使在同一行中,它也会每隔一次使用自动更改值

用法:
a=新拆分器(n)
然后
console.log(a+”和“+a)

函数拆分器(n){
this.p1=数学楼层(n/2);
this.p2=n-this.p1;
这个.cnt=0;
this.valueOf=()=>(++this.cnt%2)?this.p1:this.p2;
返回n;
}
a=新分离器(5);
控制台日志(a+“和”+a);
控制台日志(a+“和”+a);
控制台日志(a+“和”+a);
b=新分离器(11);
控制台日志(b+“和”+b)

只有其他解决方案,我认为性能还可以。

如果num是一个数字,因此num/2也是一个数字,为什么要使用parseInt(一个用于将字符串转换为数字的函数)?(我知道为什么,但我认为你的答案将从解释你为什么这么做以及你依靠什么样的parseInt特殊的怪癖使它工作中受益匪浅。)老实说,
var p2=p1
比调用两次
parseInt
浪费更少。另外,只有在有字符串时才使用
parseInt
。它不适用于数字。@Bergi它也适用于数字。但数字将首先转换为字符串,然后解析为整数。检查:@AnthonyGrist我使用parseInt只是为了将float转换成int。我的答案不依赖于parseInt的任何其他特性。我在JS方面没有太多经验,因为它不是我的主要语言。我现在已经更新了我的答案。谢谢。只是想知道:既然Javascript只有浮点数而没有整数,即使
x
为偶数,
p1
p2
的值是否会不同?IEEE浮点中的@EricDuminil
/2
不会导致精度损失或任何整数的舍入,这些整数可以表示为/2之前的浮点。它只涉及从指数部分减去1。@雅克:你可能会丢失低于正常值的数字的数据,因为/2会将有效位右移一位,而不是改变指数。然而,低于正常值的数字比一小,所以它们可能对这个问题不重要(它们不是整数)。@Kevin是的,非常重要。我说“任何可以表示为浮点的整数”是有原因的。次正常数不是任何整数作为浮点数的表示形式。因此与我的评论无关(正如你所指出的,也与这个问题无关)。FWIW,这为
x=1.5
给出了
10
。另请参见Eric Lippert的。这是另一个问题,但是你可能也应该采取类似的方法来定义你的需求,然后以一种明显正确的方式来编写代码。当你真正指的是
Math.floor
@Mehrdad时,千万不要使用
parseInt
。这是一些因素的混合:纯
javascript
标记问题变得非常简单(OP不做任何研究)或者无聊,问题发布的时间,当时人们的情绪…当我在这里时,它只有6张赞成票,但在很短的时间内。然后,这个问题被列在“热门网络问题”中。从那时起,它是一个滚雪球效应(或者如果你愿意,是一个积极的反馈)。为什么不能是5,1和6,1呢?我想当第一个是较小/较大的时,你应该明确地使用
Math.floor
Math.ceil
round
使它模棱两可。@cᴏʟᴅsᴘᴇᴇᴅ 然后使用Math.ceil-你甚至不必考虑它会被取整,即使除数改变,它仍然会被取整。而Math.ceil较短,因此如果在code golf上结束,它会计算更多的分数。:@georg it's
var n = 7;
var p1 = (n - (n % 2)) / 2;
var p2 = (n + (n % 2)) / 2;

console.log(p1, p2);
var number = 7;
var part1 = 0;
var part2 = 0;

if(number == 0) {
    part1 = (part2 = 0);
    console.log(part1, part2);
}
else if(number == 1) {
    part1 = 1;
    part2 = 0;
    console.log(part1, part2);
}
else if((number % 2) == 0) {
    part1 = part2 = number / 2;
    console.log(part1, part2);
}
else {
    part1 = (number + 1) / 2;
    part2 = number - part1;
    console.log(part1, part2);
}