﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-一杯清茶-随笔分类-编程炼狱</title><link>http://www.blogjava.net/huyi0616/category/28973.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 07 Jul 2010 12:55:45 GMT</lastBuildDate><pubDate>Wed, 07 Jul 2010 12:55:45 GMT</pubDate><ttl>60</ttl><item><title>JAVA String.format 方法使用介绍</title><link>http://www.blogjava.net/huyi0616/archive/2010/07/07/325456.html</link><dc:creator>一杯清茶</dc:creator><author>一杯清茶</author><pubDate>Wed, 07 Jul 2010 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/huyi0616/archive/2010/07/07/325456.html</guid><wfw:comment>http://www.blogjava.net/huyi0616/comments/325456.html</wfw:comment><comments>http://www.blogjava.net/huyi0616/archive/2010/07/07/325456.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi0616/comments/commentRss/325456.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi0616/services/trackbacks/325456.html</trackback:ping><description><![CDATA[转载自：http://blog.csdn.net/andycpp/archive/2007/08/18/1749700.aspx<br />
<br />
&nbsp;&nbsp;&nbsp; 在JDK1.5中，String类增加了一个非常有用的静态函数format(String&nbsp; format, Objece...&nbsp; argues)，可以将各类数据格式化为字符串并输出。其中format参数指定了输出的格式，是最复杂也是最难掌握的一点，而argues则是一系列等待被格式化的对象。该函数对c语言中printf函数的用法进行了一定的模仿，因此有c语言基础的人学起来会轻松许多。下面我们着重讨论一下format 参数的格式及含义。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; format参数中可以包含不需要转化的字符串，这些字符串是你写什么，最终就输出什么。同时还包含一些特殊格式的内容，来指定将哪个对象来转换，以及转换成什么形式。这种特殊的格式通通以%index$开头，index从1开始取值，表示将第index个参数拿进来进行格式化。这一点比c语言要强一点， c语言只能按照参数的顺序依次格式化，而java可以选择第n个参数来格式化。由于该函数可以对任意一个对象进行格式化，不同的对象适用的参数也不同，因此我们下面分类来讨论。<br />
<br />
<span style="font-size: medium; font-family: "><span style="color: #ff0000">1.<span style="color: #000000">对<span style="color: #ff0000">整数</span>进行格式化</span>：<span style="color: #339966">%[index$]</span>[标识]<span style="color: #339966">[最小宽度]</span>转换方式<br style="color: #ff0000" />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们可以看到，格式化字符串由4部分组成，其中<span style="color: #ff0000"><span style="color: #339966">%[index$]<span style="color: #000000">的含义</span></span></span>我们上面已经讲过，<span style="color: #ff0000"><span style="color: #339966">[最小宽度]</span></span>的含义也很好理解，就是最终该整数转化的字符串最少包含多少位数字。我们来看看剩下2个部分的含义吧：<br />
</span>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6 0% 50%; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; padding-top: 4px; border-bottom: windowtext 0.5pt solid; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">
<div><span style="font-size: medium; font-family: "><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000"><span style="font-size: medium; font-family: "><span style="color: #ff0000">标识</span>：&nbsp;<br />
<img style="color: #339966" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span></span><span style="color: #339966"><span style="font-size: medium; font-family: ">'-'&nbsp;&nbsp;&nbsp;&nbsp;在最小宽度内左对齐，不可以与&#8220;用0填充&#8221;同时使用<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'#'&nbsp;&nbsp;&nbsp;&nbsp;只适用于8进制和16进制，8进制时在结果前面增加一个0，16进制时在结果前面增加0x<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'+'&nbsp;&nbsp;&nbsp;&nbsp;结果总是包括一个符号（一般情况下只适用于10进制，若对象为BigInteger才可以用于8进制和16进制）<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'&nbsp;&nbsp;'&nbsp;&nbsp;&nbsp;&nbsp;正值前加空格，负值前加负号（一般情况下只适用于10进制，若对象为BigInteger才可以用于8进制和16进制）<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'0'&nbsp;&nbsp;&nbsp;&nbsp;结果将用零来填充<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />','&nbsp;&nbsp;&nbsp;&nbsp;只适用于10进制，每3位数字之间用&#8220;，&#8221;分隔<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'('&nbsp;&nbsp;&nbsp;&nbsp;若参数是负数，则结果中不添加负号而是用圆括号把数字括起来（同&#8216;+</span></span><span style="font-size: medium; font-family: "><span style="color: #000000"><span style="color: #339966">&#8217;具有同样的限制）</span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #ff0000">转换方式</span>：<br />
<img style="color: #339966" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #339966">d</span></span><span style="color: #339966">-十进制&nbsp;&nbsp;&nbsp;o-八进制&nbsp;&nbsp;&nbsp;x或X-十六进制</span></span></div>
</div>
<p><span style="font-size: medium; font-family: ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上面的说明过于枯燥，我们来看几个具体的例子。需要特别注意的两点是：<br />
<span style="color: #ff0000">1.大部分标识字符可以同时使用.<br />
2.String.format()方法定义如下:<br />
<span style="color: #000000">public static String format(String format, Object ... args)<br />
format()第二个参数类型是java 1.5引入的新特性,可支持传无限个参数进来.<br />
因此1$代表args的第一个参数,2$代表args的第二个参数,以次类推. </span></span></span></p>
<p><span style="font-size: medium; font-family: "><span style="color: #ff0000"><span style="color: #000000"></p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6 0% 50%; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; padding-top: 4px; border-bottom: windowtext 0.5pt solid; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">
<div><span style="color: #339966"><span style="font-size: medium; font-family: ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(String.format("%1$,09d -&gt; %2$+5d", -3123,123));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(String.format("%1$9d", -31));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(String.format("%1$-9d", -31));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(String.format("%1$(9d", -31));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(String.format("%1$#9x", 5689));</span></span></div>
<div><span style="color: #339966"><span style="font-size: medium; font-family: ">//结果为：<br />
//-0003,123 -&gt;&nbsp; +123<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -31<br />
//-31&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
//&nbsp;&nbsp;&nbsp;&nbsp; (31)<br />
//&nbsp;&nbsp; 0x1639</span></span></div>
</div>
</span></span></span><span style="color: #ff0000"><span style="font-size: medium; font-family: ">2.<span style="color: #000000">对<span style="color: #ff0000">浮点数</span>进行格式化</span>：</span><span style="color: #339966"><span style="font-size: medium; font-family: ">%[index$]<span style="color: #ff0000">[标识]</span>[最少宽度]<span style="color: #ff0000">[.精度]</span>转换方式<br />
</span><span style="color: #000000"><span style="font-size: medium; font-family: ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们可以看到，浮点数的转换多了一个&#8220;精度&#8221;选项，可以控制小数点后面的位数。 </span></span></span></span>
<p>&nbsp;</p>
<p>
<p><span style="color: #ff0000"><span style="color: #339966"><span style="color: #000000"><span style="font-size: medium; font-family: "></p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6 0% 50%; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; padding-top: 4px; border-bottom: windowtext 0.5pt solid; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">
<div><span style="font-size: medium; font-family: "><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000"><span style="font-size: medium; font-family: "><span style="color: #ff0000">标识</span>：&nbsp;<br />
<img style="color: #339966" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span></span><span style="color: #339966"><span style="font-size: medium; font-family: ">'-'&nbsp;&nbsp;&nbsp;&nbsp;在最小宽度内左对齐，不可以与&#8220;用0填充&#8221;同时使用<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'+'&nbsp;&nbsp;&nbsp;&nbsp;结果总是包括一个符号<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'&nbsp;&nbsp;'&nbsp;&nbsp;&nbsp;&nbsp;正值前加空格，负值前加负号<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'0'&nbsp;&nbsp;&nbsp;&nbsp;结果将用零来填充<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />','&nbsp;&nbsp;&nbsp;&nbsp;每3位数字之间用&#8220;，&#8221;分隔（只适用于fgG的转换）<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'('</span></span><span style="color: #000000"><span style="font-size: medium; font-family: "><span style="color: #339966">&nbsp;&nbsp;&nbsp;&nbsp;若参数是负数，则结果中不添加负号而是用圆括号把数字括起来（只适用于eEfgG的转换）</span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #ff0000">转换方式</span>：<br />
<img style="color: #339966" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span></span><span style="color: #339966"><span style="font-size: medium; font-family: ">'e',&nbsp;'E'&nbsp;&nbsp;--&nbsp;&nbsp;结果被格式化为用计算机科学记数法表示的十进制数<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'f'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;&nbsp;结果被格式化为十进制普通表示方式<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'g',&nbsp;'G'&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;&nbsp;根据具体情况，自动选择用普通表示方式还是科学计数法方式<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'a',&nbsp;'A'&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;&nbsp;&nbsp;结果被格式化为带有效位数和指数的十六进制浮点数</span></span></div>
</div>
<p><span style="font-size: medium; font-family: ">3.<span style="color: #000000">对<span style="color: #ff0000">字符</span>进行格式化</span>：<br />
</span><span style="color: #000000"><span style="font-size: medium; font-family: ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对字符进行格式化是非常简单的，c表示字符，标识中'-'表示左对齐，其他就没什么了。</span></span></p>
<span style="color: #ff0000"><span style="font-size: medium; font-family: ">4.<span style="color: #000000">对<span style="color: #ff0000">百分比符号</span>进行格式化</span>：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000"><span style="font-size: medium; font-family: ">看了上面的说明，大家会发现百分比符号&#8220;%&#8221;是特殊格式的一个前缀。那么我们要输入一个百分比符号该怎么办呢？肯定是需要转义字符的,但是要注意的是，在这里转义字符不是&#8220;\&#8221;，而是&#8220;%&#8221;。换句话说，下面这条语句可以输出一个&#8220;12%&#8221;：<br />
<span style="color: #008080">System.out.println(String.format("%1$d%%", 12));</span><br />
<br />
</span></span></span><span style="color: #ff0000"><span style="font-size: medium; font-family: ">5.<span style="color: #000000">取得<span style="color: #ff0000">平台独立的行分隔符</span></span>：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #008080">System.getProperty("line.separator")<span style="color: #000000">可以取得平台独立的行分隔符，但是用在format中间未免显得过于烦琐了。于是format函数自带了一个平台独立的行分隔符那就是</span></span></span></span><span style="color: #ff0000"><span style="color: #000000"><span style="color: #008080"><span style="font-size: medium; font-family: ">String.format("%n")。<br />
<br />
</span></span></span></span><span style="color: #ff0000"><span style="font-size: medium; font-family: ">6.<span style="color: #000000">对<span style="color: #ff0000">日期类型</span>进行格式化</span>：<br />
</span><span style="font-size: medium; font-family: "><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以下日期和时间转换的后缀字符是为 't' 和 'T' 转换定义的。这些类型相似于但不完全等同于那些由 GNU date 和 POSIX strftime(3c) 定义的类型。提供其他转换类型是为了访问特定于 Java 的功能（如将 'L' 用作秒中的毫秒）。<br />
<br />
<span style="color: #ff0000">以下转换字符用来格式化时间：</span></span><br style="color: #000000" />
<span style="color: #000000">'H' &nbsp;&nbsp;&nbsp; 24 小时制的小时，被格式化为必要时带前导零的两位数，即 00 - 23。</span><br style="color: #000000" />
<span style="color: #000000">'I' &nbsp;&nbsp;&nbsp; 12 小时制的小时，被格式化为必要时带前导零的两位数，即 01 - 12。</span><br style="color: #000000" />
<span style="color: #000000">'k' &nbsp;&nbsp;&nbsp; 24 小时制的小时，即 0 - 23。</span><br style="color: #000000" />
<span style="color: #000000">'l' &nbsp;&nbsp;&nbsp; 12 小时制的小时，即 1 - 12。</span><br style="color: #000000" />
<span style="color: #000000">'M' &nbsp;&nbsp;&nbsp; 小时中的分钟，被格式化为必要时带前导零的两位数，即 00 - 59。</span><br style="color: #000000" />
<span style="color: #000000">'S' &nbsp;&nbsp;&nbsp; 分钟中的秒，被格式化为必要时带前导零的两位数，即 00 - 60 （"60" 是支持闰秒所需的一个特殊值）。</span><br style="color: #000000" />
<span style="color: #000000">'L' &nbsp;&nbsp;&nbsp; 秒中的毫秒，被格式化为必要时带前导零的三位数，即 000 - 999。</span><br style="color: #000000" />
<span style="color: #000000">'N' &nbsp;&nbsp;&nbsp; 秒中的毫微秒，被格式化为必要时带前导零的九位数，即 000000000 - 999999999。</span><br style="color: #000000" />
<span style="color: #000000">'p' &nbsp;&nbsp;&nbsp; 特定于语言环境的 上午或下午 标记以小写形式表示，例如 "am" 或 "pm"。使用转换前缀 'T' 可以强行将此输出转换为大写形式。</span><br style="color: #000000" />
<span style="color: #000000">'z' &nbsp;&nbsp;&nbsp; 相对于 GMT 的 RFC 822 格式的数字时区偏移量，例如 -0800。</span><br style="color: #000000" />
<span style="color: #000000">'Z' &nbsp;&nbsp;&nbsp; 表示时区缩写形式的字符串。Formatter 的语言环境将取代参数的语言环境（如果有）。</span><br />
<span style="color: #000000">'s' &nbsp;&nbsp;&nbsp; 自协调世界时 (UTC) 1970 年 1 月 1 日 00:00:00 至现在所经过的秒数，即 Long.MIN_VALUE/1000 与 Long.MAX_VALUE/1000 之间的差值。</span><br style="color: #000000" />
<span style="color: #000000">'Q' &nbsp;&nbsp;&nbsp; 自协调世界时 (UTC) 1970 年 1 月 1 日 00:00:00 至现在所经过的毫秒数，即 Long.MIN_VALUE 与 Long.MAX_VALUE 之间的差值。</span><br style="color: #000000" />
<br style="color: #000000" />
<span style="color: #ff0000">以下转换字符用来格式化日期：</span><br style="color: #000000" />
<span style="color: #000000">'B' &nbsp;&nbsp;&nbsp; 特定于语言环境的月份全称，例如 "January" 和 "February"。</span><br style="color: #000000" />
<span style="color: #000000">'b' &nbsp;&nbsp;&nbsp; 特定于语言环境的月份简称，例如 "Jan" 和 "Feb"。</span><br style="color: #000000" />
<span style="color: #000000">'h' &nbsp;&nbsp;&nbsp; 与 'b' 相同。</span><br style="color: #000000" />
<span style="color: #000000">'A' &nbsp;&nbsp;&nbsp; 特定于语言环境的星期几全称，例如 "Sunday" 和 "Monday"</span><br style="color: #000000" />
<span style="color: #000000">'a' &nbsp;&nbsp;&nbsp; 特定于语言环境的星期几简称，例如 "Sun" 和 "Mon"</span><br style="color: #000000" />
<span style="color: #000000">'C' &nbsp;&nbsp;&nbsp; 除以 100 的四位数表示的年份，被格式化为必要时带前导零的两位数，即 00 - 99</span><br style="color: #000000" />
<span style="color: #000000">'Y' &nbsp;&nbsp;&nbsp; 年份，被格式化为必要时带前导零的四位数（至少），例如，0092 等于格里高利历的 92 CE。</span><br style="color: #000000" />
<span style="color: #000000">'y' &nbsp;&nbsp;&nbsp; 年份的最后两位数，被格式化为必要时带前导零的两位数，即 00 - 99。</span><br style="color: #000000" />
<span style="color: #000000">'j' &nbsp;&nbsp;&nbsp; 一年中的天数，被格式化为必要时带前导零的三位数，例如，对于格里高利历是 001 - 366。</span><br style="color: #000000" />
<span style="color: #000000">'m' &nbsp;&nbsp;&nbsp; 月份，被格式化为必要时带前导零的两位数，即 01 - 13。</span><br style="color: #000000" />
<span style="color: #000000">'d' &nbsp;&nbsp;&nbsp; 一个月中的天数，被格式化为必要时带前导零两位数，即 01 - 31</span><br style="color: #000000" />
<span style="color: #000000">'e' &nbsp;&nbsp;&nbsp; 一个月中的天数，被格式化为两位数，即 1 - 31。</span><br style="color: #000000" />
<br style="color: #000000" />
<span style="color: #ff0000">以下转换字符用于格式化常见的日期/时间组合。</span><br style="color: #000000" />
<span style="color: #000000">'R' &nbsp;&nbsp;&nbsp; 24 小时制的时间，被格式化为 "%tH:%tM"</span><br style="color: #000000" />
<span style="color: #000000">'T' &nbsp;&nbsp;&nbsp; 24 小时制的时间，被格式化为 "%tH:%tM:%tS"。</span><br style="color: #000000" />
<span style="color: #000000">'r' &nbsp;&nbsp;&nbsp; 12 小时制的时间，被格式化为 "%tI:%tM:%tS %Tp"。上午或下午标记 ('%Tp') 的位置可能与语言环境有关。</span><br style="color: #000000" />
<span style="color: #000000">'D' &nbsp;&nbsp;&nbsp; 日期，被格式化为 "%tm/%td/%ty"。</span><br style="color: #000000" />
<span style="color: #000000">'F' &nbsp;&nbsp;&nbsp; ISO 8601 格式的完整日期，被格式化为 "%tY-%tm-%td"。</span><br style="color: #000000" />
<span style="color: #000000">'c' &nbsp;&nbsp;&nbsp; 日期和时间，被格式化为 "%ta %tb %td %tT %tZ %tY"，例如 "Sun Jul 20 16:17:00 EDT 1969"。</span></span></span></span></span></span></span>
<img src ="http://www.blogjava.net/huyi0616/aggbug/325456.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi0616/" target="_blank">一杯清茶</a> 2010-07-07 15:32 <a href="http://www.blogjava.net/huyi0616/archive/2010/07/07/325456.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ZZ-大型网站架构演变和知识体系 </title><link>http://www.blogjava.net/huyi0616/archive/2010/04/14/318225.html</link><dc:creator>一杯清茶</dc:creator><author>一杯清茶</author><pubDate>Wed, 14 Apr 2010 01:55:00 GMT</pubDate><guid>http://www.blogjava.net/huyi0616/archive/2010/04/14/318225.html</guid><wfw:comment>http://www.blogjava.net/huyi0616/comments/318225.html</wfw:comment><comments>http://www.blogjava.net/huyi0616/archive/2010/04/14/318225.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi0616/comments/commentRss/318225.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi0616/services/trackbacks/318225.html</trackback:ping><description><![CDATA[<p><br />
&nbsp;</p>
<div class="postbody">
<p style="text-indent: 2em">转自：http://www.blogjava.net/sterning/archive/2009/11/06/301468.html<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;之前也有一些介绍大型网站架构演变的文章，例如LiveJournal的、ebay的，都是非常值得参考的，不过感觉他们讲的更多的是每次演变的结果，而没有很详细的讲为什么需要做这样的演变，再加上近来感觉有不少同学都很难明白为什么一个网站需要那么复杂的技术，于是有了写这篇文章的想法，在这篇文章中 将阐述一个普通的网站发展成大型网站过程中的一种较为典型的架构演变历程和所需掌握的知识体系，希望能给想从事互联网行业的同学一点初步的概念，:)，文中的不对之处也请各位多给点建议，让本文真正起到抛砖引玉的效果。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">架构演变第一步：物理分离webserver和数据库</p>
<p style="text-indent: 2em">最开始，由于某些想法，于是在互联网上搭建了一个网站，这个时候甚至有可能主机都是租借的，但由于这篇文章我们只关注架构的演变历程，因此就假设这个时候 已经是托管了一台主机，并且有一定的带宽了，这个时候由于网站具备了一定的特色，吸引了部分人访问，逐渐你发现系统的压力越来越高，响应速度越来越慢，而这个时候比较明显的是数据库和应用互相影响，应用出问题了，数据库也很容易出现问题，而数据库出问题的时候，应用也容易出问题，于是进入了第一步演变阶段：将应用和数据库从物理上分离，变成了两台机器，这个时候技术上没有什么新的要求，但你发现确实起到效果了，系统又恢复到以前的响应速度了，并且支撑住了更高的流量，并且不会因为数据库和应用形成互相的影响。</p>
<p style="text-indent: 2em">看看这一步完成后系统的图示：</p>
<p style="text-indent: 2em"><img title="大型网站架构演变和知识体系  - 怪狗 - 怪狗" alt="大型网站架构演变和知识体系  - 怪狗 - 怪狗" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/1.PNG" border="0" /></p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">这一步涉及到了这些知识体系：</p>
<p style="text-indent: 2em">这一步架构演变对技术上的知识体系基本没有要求。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">架构演变第二步：增加页面缓存</p>
<p style="text-indent: 2em">好景不长，随着访问的人越来越多，你发现响应速度又开始变慢了，查找原因，发现是访问数据库的操作太多，导致数据连接竞争激烈，所以响应变慢，但数据库连 接又不能开太多，否则数据库机器压力会很高，因此考虑采用缓存机制来减少数据库连接资源的竞争和对数据库读的压力，这个时候首先也许会选择采用squid 等类似的机制来将系统中相对静态的页面（例如一两天才会有更新的页面）进行缓存（当然，也可以采用将页面静态化的方案），这样程序上可以不做修改，就能够 很好的减少对webserver的压力以及减少数据库连接资源的竞争，OK，于是开始采用squid来做相对静态的页面的缓存。</p>
<p style="text-indent: 2em">看看这一步完成后系统的图示：</p>
<p style="text-indent: 2em"><img title="大型网站架构演变和知识体系  - 怪狗 - 怪狗" alt="大型网站架构演变和知识体系  - 怪狗 - 怪狗" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/2.PNG" border="0" /></p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">这一步涉及到了这些知识体系：</p>
<p style="text-indent: 2em">前端页面缓存技术，例如squid，如想用好的话还得深入掌握下squid的实现方式以及缓存的失效算法等。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">架构演变第三步：增加页面片段缓存</p>
<p style="text-indent: 2em">增加了squid做缓存后，整体系统的速度确实是提升了，webserver的压力也开始下降了，但随着访问量的增加，发现系统又开始变的有些慢了，在尝 到了squid之类的动态缓存带来的好处后，开始想能不能让现在那些动态页面里相对静态的部分也缓存起来呢，因此考虑采用类似ESI之类的页面片段缓存策略，OK，于是开始采用ESI来做动态页面中相对静态的片段部分的缓存。</p>
<p style="text-indent: 2em">看看这一步完成后系统的图示：</p>
<p style="text-indent: 2em"><img title="大型网站架构演变和知识体系  - 怪狗 - 怪狗" alt="大型网站架构演变和知识体系  - 怪狗 - 怪狗" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/3.PNG" border="0" /></p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">这一步涉及到了这些知识体系：</p>
<p style="text-indent: 2em">页面片段缓存技术，例如ESI等，想用好的话同样需要掌握ESI的实现方式等；</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">架构演变第四步：数据缓存</p>
<p style="text-indent: 2em">在采用ESI之类的技术再次提高了系统的缓存效果后，系统的压力确实进一步降低了，但同样，随着访问量的增加，系统还是开始变慢，经过查找，可能会发现系 统中存在一些重复获取数据信息的地方，像获取用户信息等，这个时候开始考虑是不是可以将这些数据信息也缓存起来呢，于是将这些数据缓存到本地内存，改变完毕后，完全符合预期，系统的响应速度又恢复了，数据库的压力也再度降低了不少。</p>
<p style="text-indent: 2em">看看这一步完成后系统的图示：</p>
<p style="text-indent: 2em"><img title="大型网站架构演变和知识体系  - 怪狗 - 怪狗" alt="大型网站架构演变和知识体系  - 怪狗 - 怪狗" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/4.PNG" border="0" /></p>
<p style="text-indent: 2em">这一步涉及到了这些知识体系：</p>
<p style="text-indent: 2em">缓存技术，包括像Map数据结构、缓存算法、所选用的框架本身的实现机制等。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">架构演变第五步： 增加webserver</p>
<p style="text-indent: 2em">好景不长，发现随着系统访问量的再度增加，webserver机器的压力在高峰期会上升到比较高，这个时候开始考虑增加一台webserver，这也是为了同时解决可用性的问题，避免单台的webserver down机的话就没法使用了，在做了这些考虑后，决定增加一台webserver，增加一台webserver时，会碰到一些问题，典型的有：</p>
<p style="text-indent: 2em">1、如何让访问分配到这两台机器上，这个时候通常会考虑的方案是Apache自带的负载均衡方案，或LVS这类的软件负载均衡方案；</p>
<p style="text-indent: 2em">2、如何保持状态信息的同步，例如用户session等，这个时候会考虑的方案有写入数据库、写入存储、cookie或同步session信息等机制等；</p>
<p style="text-indent: 2em">3、如何保持数据缓存信息的同步，例如之前缓存的用户数据等，这个时候通常会考虑的机制有缓存同步或分布式缓存；</p>
<p style="text-indent: 2em">4、如何让上传文件这些类似的功能继续正常，这个时候通常会考虑的机制是使用共享文件系统或存储等；</p>
<p style="text-indent: 2em">在解决了这些问题后，终于是把webserver增加为了两台，系统终于是又恢复到了以往的速度。</p>
<p style="text-indent: 2em">看看这一步完成后系统的图示：</p>
<p style="text-indent: 2em">&lt;!--[if !vml]--&gt;<img title="大型网站架构演变和知识体系  - 怪狗 - 怪狗" alt="大型网站架构演变和知识体系  - 怪狗 - 怪狗" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/5.PNG" border="0" /></p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">这一步涉及到了这些知识体系：</p>
<p style="text-indent: 2em">负载均衡技术（包括但不限于硬件负载均衡、软件负载均衡、负载算法、linux转发协议、所选用的技术的实现细节等）、主备技术（包括但不限于ARP欺骗、linux heart-beat等）、状态信息或缓存同步技术（包括但不限于Cookie技术、UDP协议、状态信息广播、所选用的缓存同步技术的实现细节等）、共享文件技术（包括但不限于NFS等）、存储技术（包括但不限于存储设备等）。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">架构演变第六步：分库</p>
<p style="text-indent: 2em">享受了一段时间的系统访问量高速增长的幸福后，发现系统又开始变慢了，这次又是什么状况呢，经过查找，发现数据库写入、更新的这些操作的部分数据库连接的 资源竞争非常激烈，导致了系统变慢，这下怎么办呢，此时可选的方案有数据库集群和分库策略，集群方面像有些数据库支持的并不是很好，因此分库会成为比较普遍的策略，分库也就意味着要对原有程序进行修改，一通修改实现分库后，不错，目标达到了，系统恢复甚至速度比以前还快了。</p>
<p style="text-indent: 2em">看看这一步完成后系统的图示：</p>
<p style="text-indent: 2em">&lt;!--[if !vml]--&gt;<img title="大型网站架构演变和知识体系  - 怪狗 - 怪狗" alt="大型网站架构演变和知识体系  - 怪狗 - 怪狗" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/6.PNG" border="0" /></p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">这一步涉及到了这些知识体系：</p>
<p style="text-indent: 2em">这一步更多的是需要从业务上做合理的划分，以实现分库，具体技术细节上没有其他的要求；</p>
<p style="text-indent: 2em">但同时随着数据量的增大和分库的进行，在数据库的设计、调优以及维护上需要做的更好，因此对这些方面的技术还是提出了很高的要求的。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">架构演变第七步：分表、DAL和分布式缓存</p>
<p style="text-indent: 2em">随着系统的不断运行，数据量开始大幅度增长，这个时候发现分库后查询仍然会有些慢，于是按照分库的思想开始做分表的工作，当然，这不可避免的会需要对程序 进行一些修改，也许在这个时候就会发现应用自己要关心分库分表的规则等，还是有些复杂的，于是萌生能否增加一个通用的框架来实现分库分表的数据访问，这个在ebay的架构中对应的就是DAL，这个演变的过程相对而言需要花费较长的时间，当然，也有可能这个通用的框架会等到分表做完后才开始做，同时，在这个阶段可 能会发现之前的缓存同步方案出现问题，因为数据量太大，导致现在不太可能将缓存存在本地，然后同步的方式，需要采用分布式缓存方案了，于是，又是一通考察和折磨，终于是将大量的数据缓存转移到分布式缓存上了。</p>
<p style="text-indent: 2em">看看这一步完成后系统的图示：</p>
<p style="text-indent: 2em">&lt;!--[if !vml]--&gt;<img title="大型网站架构演变和知识体系  - 怪狗 - 怪狗" alt="大型网站架构演变和知识体系  - 怪狗 - 怪狗" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/7.PNG" border="0" /></p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">这一步涉及到了这些知识体系：</p>
<p style="text-indent: 2em">分表更多的同样是业务上的划分，技术上涉及到的会有动态hash算法、consistent hash算法等；</p>
<p style="text-indent: 2em">DAL涉及到比较多的复杂技术，例如数据库连接的管理（超时、异常）、数据库操作的控制（超时、异常）、分库分表规则的封装等；</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">架构演变第八步：增加更多的webserver</p>
<p style="text-indent: 2em">在做完分库分表这些工作后，数据库上的压力已经降到比较低了，又开始过着每天看着访问量暴增的幸福生活了，突然有一天，发现系统的访问又开始有变慢的趋势 了，这个时候首先查看数据库，压力一切正常，之后查看webserver，发现apache阻塞了很多的请求，而应用服务器对每个请求也是比较快的，看来 是请求数太高导致需要排队等待，响应速度变慢，这还好办，一般来说，这个时候也会有些钱了，于是添加一些webserver服务器，在这个添加 webserver服务器的过程，有可能会出现几种挑战：</p>
<p style="text-indent: 2em">1、Apache的软负载或LVS软负载等无法承担巨大的web访问量（请求连接数、网络流量等）的调度了，这个时候如果经费允许的话，会采取的方案是购 买硬件负载，例如F5、Netsclar、Athelon之类的，如经费不允许的话，会采取的方案是将应用从逻辑上做一定的分类，然后分散到不同的软负载集群中；</p>
<p style="text-indent: 2em">2、原有的一些状态信息同步、文件共享等方案可能会出现瓶颈，需要进行改进，也许这个时候会根据情况编写符合网站业务需求的分布式文件系统等；</p>
<p style="text-indent: 2em">在做完这些工作后，开始进入一个看似完美的无限伸缩的时代，当网站流量增加时，应对的解决方案就是不断的添加webserver。</p>
<p style="text-indent: 2em">看看这一步完成后系统的图示：</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img title="大型网站架构演变和知识体系  - 怪狗 - 怪狗" alt="大型网站架构演变和知识体系  - 怪狗 - 怪狗" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/8.PNG" border="0" /></p>
<p style="text-indent: 2em">这一步涉及到了这些知识体系：</p>
<p style="text-indent: 2em">到了这一步，随着机器数的不断增长、数据量的不断增长和对系统可用性的要求越来越高，这个时候要求对所采用的技术都要有更为深入的理解，并需要根据网站的需求来做更加定制性质的产品。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">架构演变第九步：数据读写分离和廉价存储方案</p>
<p style="text-indent: 2em">突然有一天，发现这个完美的时代也要结束了，数据库的噩梦又一次出现在眼前了，由于添加的webserver太多了，导致数据库连接的资源还是不够用，而这个时候又已经分库分表了，开始分析数据库的压力状况，可能会发现数据库的读写比很高，这个时候通常会想到数据读写分离的方案，当然，这个方案要实现并不 容易，另外，可能会发现一些数据存储在数据库上有些浪费，或者说过于占用数据库资源，因此在这个阶段可能会形成的架构演变是实现数据读写分离，同时编写一些更为廉价的存储方案，例如BigTable这种。</p>
<p style="text-indent: 2em">看看这一步完成后系统的图示：</p>
<p style="text-indent: 2em">&lt;!--[if !vml]--&gt;<img title="大型网站架构演变和知识体系  - 怪狗 - 怪狗" alt="大型网站架构演变和知识体系  - 怪狗 - 怪狗" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/9.PNG" border="0" /></p>
<p style="text-indent: 2em">&lt;!--[endif]--&gt;</p>
<p style="text-indent: 2em">这一步涉及到了这些知识体系：</p>
<p style="text-indent: 2em">数据读写分离要求对数据库的复制、standby等策略有深入的掌握和理解，同时会要求具备自行实现的技术；</p>
<p style="text-indent: 2em">廉价存储方案要求对OS的文件存储有深入的掌握和理解，同时要求对采用的语言在文件这块的实现有深入的掌握。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">架构演变第十步：进入大型分布式应用时代和廉价服务器群梦想时代</p>
<p style="text-indent: 2em">经过上面这个漫长而痛苦的过程，终于是再度迎来了完美的时代，不断的增加webserver就可以支撑越来越高的访问量了，对于大型网站而言，人气的重要毋 庸置疑，随着人气的越来越高，各种各样的功能需求也开始爆发性的增长，这个时候突然发现，原来部署在webserver上的那个web应用已经非常庞大 了，当多个团队都开始对其进行改动时，可真是相当的不方便，复用性也相当糟糕，基本是每个团队都做了或多或少重复的事情，而且部署和维护也是相当的麻烦， 因为庞大的应用包在N台机器上复制、启动都需要耗费不少的时间，出问题的时候也不是很好查，另外一个更糟糕的状况是很有可能会出现某个应用上的bug就导 致了全站都不可用，还有其他的像调优不好操作（因为机器上部署的应用什么都要做，根本就无法进行针对性的调优）等因素，根据这样的分析，开始痛下决心，将 系统根据职责进行拆分，于是一个大型的分布式应用就诞生了，通常，这个步骤需要耗费相当长的时间，因为会碰到很多的挑战：</p>
<p style="text-indent: 2em">1、拆成分布式后需要提供一个高性能、稳定的通信框架，并且需要支持多种不同的通信和远程调用方式；</p>
<p style="text-indent: 2em">2、将一个庞大的应用拆分需要耗费很长的时间，需要进行业务的整理和系统依赖关系的控制等；</p>
<p style="text-indent: 2em">3、如何运维（依赖管理、运行状况管理、错误追踪、调优、监控和报警等）好这个庞大的分布式应用。</p>
<p style="text-indent: 2em">经过这一步，差不多系统的架构进入相对稳定的阶段，同时也能开始采用大量的廉价机器来支撑着巨大的访问量和数据量，结合这套架构以及这么多次演变过程吸取的经验来采用其他各种各样的方法来支撑着越来越高的访问量。</p>
<p style="text-indent: 2em">看看这一步完成后系统的图示：</p>
<p style="text-indent: 2em">&lt;!--[if !vml]--&gt;<img title="大型网站架构演变和知识体系  - 怪狗 - 怪狗" alt="大型网站架构演变和知识体系  - 怪狗 - 怪狗" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/10.PNG" border="0" /></p>
<p style="text-indent: 2em">&lt;!--[endif]--&gt;</p>
<p style="text-indent: 2em">这一步涉及到了这些知识体系：</p>
<p style="text-indent: 2em">这一步涉及的知识体系非常的多，要求对通信、远程调用、消息机制等有深入的理解和掌握，要求的都是从理论、硬件级、操作系统级以及所采用的语言的实现都有清楚的理解。</p>
<p style="text-indent: 2em">运维这块涉及的知识体系也非常的多，多数情况下需要掌握分布式并行计算、报表、监控技术以及规则策略等等。</p>
<p style="text-indent: 2em">说起来确实不怎么费力，整个网站架构的经典演变过程都和上面比较的类似，当然，每步采取的方案，演变的步骤有可能有不同，另外，由于网站的业务不同，会有不同的专业技术的需求，这篇blog更多的是从架构的角度来讲解演变的过程，当然，其中还有很多的技术也未在此提及，像数据库集群、数据挖掘、搜索等，但在真实的演变过程中还会借助像提升硬件配置、网络环境、改造操作系统、CDN镜像等来支撑更大的流量，因此在真实的发展过程中还会有很多的不同，另外一个大型网站要做到的远远不仅仅上面这些，还有像安全、运维、运营、服务、存储等，要做好一个大型的网站真的很不容易，写这篇文章更多的是希望能够引出更多大型网站架构演变的介绍，:)。</p>
<p style="text-indent: 2em">ps:最后附上几篇LiveJournal架构演变的文章：</p>
<p style="text-indent: 2em">从LiveJournal后台发展看大规模网站性能优化方法</p>
<p style="text-indent: 2em">http://blog.zhangjianfeng.com/article/743&nbsp;&nbsp;&nbsp; </p>
<p style="text-indent: 2em">另外从这里：http://www.danga.com/words/大家可以找到更多关于现在LiveJournal网站架构的介绍。</p>
</div>
<p style="text-indent: 2em">&nbsp;</p>
<img src ="http://www.blogjava.net/huyi0616/aggbug/318225.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi0616/" target="_blank">一杯清茶</a> 2010-04-14 09:55 <a href="http://www.blogjava.net/huyi0616/archive/2010/04/14/318225.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>贷款利息的计算方法 </title><link>http://www.blogjava.net/huyi0616/archive/2009/09/29/296949.html</link><dc:creator>一杯清茶</dc:creator><author>一杯清茶</author><pubDate>Tue, 29 Sep 2009 15:57:00 GMT</pubDate><guid>http://www.blogjava.net/huyi0616/archive/2009/09/29/296949.html</guid><wfw:comment>http://www.blogjava.net/huyi0616/comments/296949.html</wfw:comment><comments>http://www.blogjava.net/huyi0616/archive/2009/09/29/296949.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi0616/comments/commentRss/296949.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi0616/services/trackbacks/296949.html</trackback:ping><description><![CDATA[<p style="text-indent: 2em"><strong><font size="4"></font></strong>&nbsp;</p>
<p style="text-indent: 2em"><strong><font size="4">等额本息还款公式推导&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">设贷款总额为A，银行月利率为&#946;，总期数为m（个月），月还款额设为X，则各个月所欠银行贷款为：&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">第一个月A&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">第二个月A（1＋&#946;）-X&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">第三个月（A（1＋&#946;）-X）（1＋&#946;）-X＝A(1＋&#946;)2-X[1+(1+&#946;)]&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">第四个月（（A（1+&#946;）-X）（1＋&#946;）-X）（1＋&#946;）-X&nbsp;＝A(1+&#946;)3-X[1+(1+&#946;)+(1+&#946;)2]&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&#8230;&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">由此可得第n个月后所欠银行贷款为&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">A(1+&#946;)n&nbsp;&#8211;X[1+(1+&#946;)+(1+&#946;)2+&#8230;+(1+&#946;)n-1]=&nbsp;A(1+&#946;)n&nbsp;&#8211;X[(1+&#946;)n-1]/&#946;&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">由于还款总期数为m，也即第m月刚好还完银行所有贷款，因此有&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">A(1+&#946;)m&nbsp;&#8211;X[(1+&#946;)m-1]/&#946;=0&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">由此求得&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&nbsp;&nbsp;X&nbsp;=&nbsp;A&#946;(1+&#946;)m&nbsp;/[(1+&#946;)m-1]&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">◆&nbsp;&nbsp;关于A(1+&#946;)n&nbsp;&#8211;X[1+(1+&#946;)+(1+&#946;)2+&#8230;+(1+&#946;)n-1]=&nbsp;A(1+&#946;)n&nbsp;&#8211;X[(1+&#946;)n-1]/&#946;的推导用了等比数列的求和公式&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">◆&nbsp;&nbsp;1、(1+&#946;)、(1+&#946;)2、&#8230;、(1+&#946;)n-1为等比数列&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">◆&nbsp;&nbsp;关于等比数列的一些性质&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&nbsp;&nbsp;&nbsp;（1）等比数列：An+1/An=q,&nbsp;n为自然数。&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">（2）通项公式：An=A1*q^（n－1）；&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">推广式：&nbsp;An=Am&#183;q^(n－m)；&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">（3）求和公式：Sn=nA1(q=1)&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sn=[A1(1-q^n)]/(1-q)&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">（4）性质：&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">①若&nbsp;m、n、p、q&#8712;N，且m＋n=p＋q，则am&#183;an=ap*aq；&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">②在等比数列中，依次每&nbsp;k项之和仍成等比数列.&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&nbsp;(5)&#8220;G是a、b的等比中项&#8221;&#8220;G^2=ab（G&#8800;0）&#8221;.&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">（6）在等比数列中，首项A1与公比q都不为零.&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">◆所以1+(1+&#946;)+(1+&#946;)2+&#8230;+(1+&#946;)n-1&nbsp;=[(1+&#946;)n-1]/&#946;&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&nbsp;等额本金还款不同等额还款&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;问：等额本金还款是什么意思？&nbsp;与等额还款相比是否等额本金还款更省钱？&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;答：等额本金还款方式计算公式如下：每月还款额=P/（n&#215;12）+剩余借款总额&#215;I，其中P为贷款本金，I为月利率，n为贷款年限。不能将两种还款方式做简单的比较。&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">等额还款计算公式&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">每月还本付息金额&nbsp;＝&nbsp;（本金&#215;月利率&#215;（1＋月利率）^贷款月数）&nbsp;&#247;&nbsp;&nbsp;[（1＋月利率）^还款月数&nbsp;－&nbsp;1]&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">其中：每月利息&nbsp;＝&nbsp;剩余本金&nbsp;&#215;&nbsp;贷款月利率&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">每月本金&nbsp;＝&nbsp;每月月供额&nbsp;－&nbsp;每月利息&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">计算原则：银行从每月月供款中，先收剩余本金利息，后收本金；利息在月供款&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">中的比例中随剩余本金的减少而降低，本金在月供款中的比例因而升高，但月供&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">总额保持不变。&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">按月递减还款计算公式&nbsp;&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">每月还本付息金额&nbsp;＝&nbsp;（本金&nbsp;/&nbsp;还款月数）＋（本金&nbsp;－&nbsp;累计已还本金）&#215;&nbsp;月利率&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">每月本金&nbsp;＝&nbsp;总本金&nbsp;/&nbsp;还款月数&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">每月利息&nbsp;＝&nbsp;(本金&nbsp;－&nbsp;累计已还本金)&nbsp;&#215;月利率&nbsp; </font></strong></p>
<p style="text-indent: 2em"><strong><font size="4">计算原则：每月归还的本金额始终不变，利息随剩余本金的减少而减少</font></strong></p>
 <img src ="http://www.blogjava.net/huyi0616/aggbug/296949.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi0616/" target="_blank">一杯清茶</a> 2009-09-29 23:57 <a href="http://www.blogjava.net/huyi0616/archive/2009/09/29/296949.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>精确计算</title><link>http://www.blogjava.net/huyi0616/archive/2008/10/10/233481.html</link><dc:creator>一杯清茶</dc:creator><author>一杯清茶</author><pubDate>Fri, 10 Oct 2008 00:35:00 GMT</pubDate><guid>http://www.blogjava.net/huyi0616/archive/2008/10/10/233481.html</guid><wfw:comment>http://www.blogjava.net/huyi0616/comments/233481.html</wfw:comment><comments>http://www.blogjava.net/huyi0616/archive/2008/10/10/233481.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi0616/comments/commentRss/233481.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi0616/services/trackbacks/233481.html</trackback:ping><description><![CDATA[<p>/*<br />
&nbsp;* 创建日期 2004-10-14<br />
&nbsp;*<br />
&nbsp;* 如果需要精确计算,非要用String来够造BigDecimal不可<br />
&nbsp;*/</p>
<p>/**<br />
&nbsp;* @author Jstar<br />
&nbsp;*<br />
&nbsp;* <br />
&nbsp;* 窗口 &gt; 首选项 &gt; Java &gt; 代码生成 &gt; 代码和注释<br />
&nbsp;*/<br />
import java.math.BigDecimal;</p>
<p>/**<br />
&nbsp;* 由于Java的简单类型不能够精确的对浮点数进行运算，这个工具类提供精<br />
&nbsp;* 确的浮点数运算，包括加减乘除和四舍五入。<br />
&nbsp;*/</p>
<p>public class Arith {</p>
<p>&nbsp;//默认除法运算精度<br />
&nbsp;private static final int DEF_DIV_SCALE = 10;</p>
<p>&nbsp;//这个类不能实例化<br />
&nbsp;private Arith() {</p>
<p>&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 提供精确的加法运算。<br />
&nbsp; * @param v1 被加数<br />
&nbsp; * @param v2 加数<br />
&nbsp; * @return 两个参数的和<br />
&nbsp; */</p>
<p>&nbsp;public static double add(double v1, double v2) {<br />
&nbsp;&nbsp;BigDecimal b1 = new BigDecimal(Double.toString(v1));<br />
&nbsp;&nbsp;BigDecimal b2 = new BigDecimal(Double.toString(v2));&nbsp;<br />
&nbsp;&nbsp;return b1.add(b2).doubleValue();<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 提供精确的减法运算。<br />
&nbsp; * @param v1 被减数<br />
&nbsp; * @param v2 减数<br />
&nbsp; * @return 两个参数的差<br />
&nbsp; */</p>
<p>&nbsp;public static double sub(double v1, double v2) {<br />
&nbsp;&nbsp;BigDecimal b1 = new BigDecimal(Double.toString(v1));<br />
&nbsp;&nbsp;BigDecimal b2 = new BigDecimal(Double.toString(v2));<br />
&nbsp;&nbsp;return b1.subtract(b2).doubleValue();<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 提供精确的乘法运算。<br />
&nbsp; * @param v1 被乘数<br />
&nbsp; * @param v2 乘数<br />
&nbsp; * @return 两个参数的积<br />
&nbsp; */<br />
&nbsp;public static double mul(double v1, double v2) {<br />
&nbsp;&nbsp;BigDecimal b1 = new BigDecimal(Double.toString(v1));<br />
&nbsp;&nbsp;BigDecimal b2 = new BigDecimal(Double.toString(v2));<br />
&nbsp;&nbsp;return b1.multiply(b2).doubleValue();<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 提供（相对）精确的除法运算，当发生除不尽的情况时，精确到<br />
&nbsp; * 小数点以后10位，以后的数字四舍五入。<br />
&nbsp; * @param v1 被除数<br />
&nbsp; * @param v2 除数<br />
&nbsp; * @return 两个参数的商<br />
&nbsp; */</p>
<p>&nbsp;public static double div(double v1, double v2) {<br />
&nbsp;&nbsp;return div(v1, v2, DEF_DIV_SCALE);<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 提供（相对）精确的除法运算。当发生除不尽的情况时，由scale参数指<br />
&nbsp; * 定精度，以后的数字四舍五入。<br />
&nbsp; * @param v1 被除数<br />
&nbsp; * @param v2 除数<br />
&nbsp; * @param scale 表示表示需要精确到小数点以后几位。<br />
&nbsp; * @return 两个参数的商<br />
&nbsp; */</p>
<p>&nbsp;public static double div(double v1, double v2, int scale) {<br />
&nbsp;&nbsp;if (scale &lt; 0) {<br />
&nbsp;&nbsp;&nbsp;throw new IllegalArgumentException("The scale must be a positive integer or zero");<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;BigDecimal b = new BigDecimal(Double.toString(v1));<br />
&nbsp;&nbsp;BigDecimal one = new BigDecimal(Double.toString(v2));<br />
&nbsp;&nbsp;return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();<br />
&nbsp;}<br />
}</p>
<img src ="http://www.blogjava.net/huyi0616/aggbug/233481.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi0616/" target="_blank">一杯清茶</a> 2008-10-10 08:35 <a href="http://www.blogjava.net/huyi0616/archive/2008/10/10/233481.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 启动外部程序</title><link>http://www.blogjava.net/huyi0616/archive/2008/08/31/225926.html</link><dc:creator>一杯清茶</dc:creator><author>一杯清茶</author><pubDate>Sun, 31 Aug 2008 11:02:00 GMT</pubDate><guid>http://www.blogjava.net/huyi0616/archive/2008/08/31/225926.html</guid><wfw:comment>http://www.blogjava.net/huyi0616/comments/225926.html</wfw:comment><comments>http://www.blogjava.net/huyi0616/archive/2008/08/31/225926.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi0616/comments/commentRss/225926.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi0616/services/trackbacks/225926.html</trackback:ping><description><![CDATA[<p><strong><font color="#ff0000">String file="f:\mp3\i love you.mp3";</font></strong></p>
<p><strong><font color="#ff0000">Runtime.getRuntime().exec("cmd /c start \""&nbsp;&nbsp; +&nbsp;&nbsp; file + "\"");</font></strong> <br />
<br />
</p>
<p>//将空格的左边和右边加上双引号：</p>
<p><strong><font color="#339966">Runtime.getRuntime().exec("cmd /c start "&nbsp;&nbsp; +&nbsp;&nbsp; file.replaceAll(" ", "\" \""));</font></strong></p>
<img src ="http://www.blogjava.net/huyi0616/aggbug/225926.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi0616/" target="_blank">一杯清茶</a> 2008-08-31 19:02 <a href="http://www.blogjava.net/huyi0616/archive/2008/08/31/225926.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp解决乱码</title><link>http://www.blogjava.net/huyi0616/archive/2008/04/15/193002.html</link><dc:creator>一杯清茶</dc:creator><author>一杯清茶</author><pubDate>Tue, 15 Apr 2008 01:50:00 GMT</pubDate><guid>http://www.blogjava.net/huyi0616/archive/2008/04/15/193002.html</guid><wfw:comment>http://www.blogjava.net/huyi0616/comments/193002.html</wfw:comment><comments>http://www.blogjava.net/huyi0616/archive/2008/04/15/193002.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi0616/comments/commentRss/193002.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi0616/services/trackbacks/193002.html</trackback:ping><description><![CDATA[<p>1.从页面传参至后台,使用<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function selectdept(id,name,type){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var i=window.encodeURIComponent?encodeURIComponent:escape;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var curname=i(name);&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mypage="&lt;%=basePath%&gt;/knowledge/commontable/commontable_checkdept.jsp?&nbsp;&nbsp; name="+curname+"&amp;id="+id+"&amp;type="+type;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; window.open(mypage,"_blank","width=380,height=350,left=350,top=150,scrollbars=no,resizable=no");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &lt;/script&gt;<br />
2.在servlet中<br />
&nbsp;&nbsp;&nbsp;&nbsp; String comment=request.getParameter("comment");<br />
&nbsp;&nbsp;String fileName=request.getParameter("name");<br />
&nbsp;&nbsp;String id=request.getParameter("id");<br />
&nbsp;&nbsp;try {&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;request.setCharacterEncoding("utf-8");&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;comment = new String(comment.getBytes("iso-8859-1"),"utf-8"); <br />
&nbsp;&nbsp;&nbsp;fileName = new String(fileName.getBytes("iso-8859-1"),"utf-8");<br />
&nbsp;&nbsp;} catch (UnsupportedEncodingException e1) {<br />
&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<br />
&nbsp;&nbsp;&nbsp;e1.printStackTrace();<br />
&nbsp;&nbsp;}<br />
3.在页面中使用UTF-8编码</p>
<img src ="http://www.blogjava.net/huyi0616/aggbug/193002.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi0616/" target="_blank">一杯清茶</a> 2008-04-15 09:50 <a href="http://www.blogjava.net/huyi0616/archive/2008/04/15/193002.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>