制定划分的一般规则
Posted
技术标签:
【中文标题】制定划分的一般规则【英文标题】:Setting a general rule for division 【发布时间】:2014-06-23 09:48:58 【问题描述】:我有以下功能:
public static void main(String[] args)
int interval = 23950;
System.out.println (Math.round(weekInterval/1000.00)*1000);
函数所做的只是将数字(间隔)四舍五入到最接近的百或千倍数等。
现在数字区间可能会发生变化,可能从数百到数十亿不等,我想给划分一个通用规则:
这样
Math.round(weekInterval/placeholder)*placeholder)
有什么想法吗?
编辑:
到目前为止,这是我利用我有限的知识提出的——请耐心等待这可能是低效的:
public static void main(String[] args)
int weekInterval = 2500;
StringBuilder sbr = new StringBuilder();
int len = String.valueOf(weekInterval).length();
String num = "1";
for(int i = 2; i<=len; i++)
sbr.append("0");
System.out.println("Number is "+sbr.toString());
System.out.println("Number is "+num+sbr.toString());
int placeholder = Integer.valueOf(num+sbr.toString());
System.out.println((weekInterval + placeholder/2)/placeholder*placeholder);
【问题讨论】:
不是 100% 确定您要完成什么。但是你可以使用类似的东西: int placeholder= Math.pow(10,(String.valueOf(interval).length()-2)); ^^ 我一开始就想出了这个,但是如果它是一个三位数呢? length()-2 部分在这里失败。 您要指定四舍五入的内容吗?数百或数千等?或者程序应该总是四舍五入到数千等? 这是主要问题,我无法预测区间变量的长度。它的范围可以在一百到十亿之间。它应该根据区间变量的长度进行四舍五入。 对于 3 位数字。例如对于 143,我给出的代码将返回 140。到最接近的十位。这是不正确的吗?或者如果是,它应该返回什么 【参考方案1】:来自http://mindprod.com/jgloss/round.html#MULTIPLE:
// rounding m up to next highest multiple of n
int ceil = ( m + n - 1 ) / n * n;
// rounding m down to multiple of n
int floor = m / n * n;
// rounding m to nearest multiple of n
int near = ( m + n/2 ) / n * n;
这里 m 是要四舍五入的数字,n 是您的“占位符”
【讨论】:
这并没有说明负数以及 m 和 n 的限制是什么。【参考方案2】:使用 BigDecimal 的更简单的解决方案:
BigDecimal interval = new BigDecimal("8953315756233454365754734");
System.out.printf("%.0f\n",interval.round(new MathContext(1, RoundingMode.HALF_UP)));
【讨论】:
为什么不直接使用 BigDecimal,然后使用 setScale() 或 round()?以上是关于制定划分的一般规则的主要内容,如果未能解决你的问题,请参考以下文章