本来计划这周发布日期工具类DateUtil第四版的,但我在翻译“寿星天文历”的过程中,遇到了很多麻烦,加上还有工作要做,因此这周可能无法发布第四版了,无奈只能先来吐槽叙述下。

寿星天文历是许剑伟先生开发的一块精度极高的万年历,采用非常科学先进的天文算法和系列定律,并参考了大量古今农历数据和相关书籍,其最终的计算精度堪比刘安国教授制作的“日梭万年历”,但相比“日梭万年历”,寿星天文历计算未来几千年(9999年)的农历时间更为准确和具有参考价值,支持的查询范围更广(“日梭万年历”只能估算到2100年),并且最为重要的是寿星天文历是开源的!因此为我们程序员提供了一个非常好的工具!

然而寿星天文历是基于javascript语言开发,并无其他语言版本,所以才有了“翻译”之说。我要将javascript的代码翻译成java代码,起初以为工作量不会太大,但当我真正做起来后才发现,这是一个非常耗人耗力的大工作!

以前认为语言是一通百通的,但经历这次后,我才深深的认识到:根本不是这么回事。共通的只能说是基本语法和基本类型很相似,其他的很多时候都是不太一样的。而javascript和java更是在理念上有很多差异的,javascript是脚本语言,java是面向对象语言。举几个例子:

1. 计算

8/24。js结果是0.3333333333333333,,java结果是0

2. 类型

js是弱数据类型,java是严格的数据类型。var a;

变量a,可以看成是任何类型,而且类型还会根据赋值的类型不同而动态变化。而java就不是了,它有严格的类型区分,虽然可以通过Object类型去完成,但我相信大多数人是不建议这么做的。

3. 方法、变量代码的最大字节

java某一方法或变量支持书写代码的最大量是65535字节(就是某一方法或变量的代码超级多,注意我说的是书写的代码,而不是方法、变量本身支持的字节,例如List类型的变量可以有上亿的数组成员,但你无法将这上亿个成员一一用代码写出来一并赋给List,只能动态的赋值给List),这是JVM本身的问题,而js却没有限制。

4. substr

js中的substr与java的substring可不是一个概念。js的substr中的第二个参数代表的是截取长度length,而java的是结果索引endIndex。并且substr中的length超过字符串本身长度的话,则方法返回的是空串,但java的endIndex超过字符串长度的话就直接报错了。(其实js里也有substring,功能与java的类似,但仍然有不同)

5. 两个字符串的相等判断

js直接“==”即可,但java则是用equals方法

以上只是我列出的几点而已,这么多差异我事先并不是都知道的,虽然我也经常写js,但如此之多的不同,我也是今天才知道的,(吐槽一下,现在才发现自己以前写js其实还是以面向对象的理念去写的,翻译寿星天文历也让我对javascript语言有了新的认识),造成翻译过程中遇到了很多问题,我不得不参照javascript代码去一个个验证java代码,因为里面实在有太多的计算了,我必须检查计算精度。

再有,通过这次翻译,也同样增加了我对java语言的认识和理解,我发现浮点运算,double类型是有误差的,查阅资料才发现bigDecimal才是专门用来高精度计算的,虽然以前就知道一些,但现在才是“真明白”了

总而言之,言而总之,困难是遇到了,但我的心情却是愉悦激动的,也明白自己离“代码艺术大师”还有多远。

日期工具类,我会在近几天之内发布,由于double计算精度的问题,初版并没有大量的更改为bigDecimal(这也是工作量啊),只是将误差较大的计算更改为了bigDecimal类型,其余的虽有误差,但误差非常小,完全可以忽略不计(更何况算法本身就存在误差),所以日后如果我有时间再都改为bigDecimal吧。

翻译“寿星天文历”有感相关推荐

  1. 寿星天文历Java版源码

    这个月好忙,一直没时间弄"寿星天文历",其实翻译早就在元旦弄完了,但始终没空做梳理整合,后来我考虑到一些朋友们或许需要原始版的寿星天文历Java代码,所以我还是先发一原始翻译的版本 ...

  2. 寿星天文历Java封装整理版

    由于生活和工作的原因,"寿星天文历"我一直没有动,长时间的丢弃后,当重新拾起时,比较费劲.编程就是这样,思维的火花只在当初的那一瞬,一旦熄灭,重新再点燃断掉的思维是很困难的.因为人 ...

  3. 中国假期、A股日历及八字算命——ChnCal日历小工具介绍

    ChnCal是一个python库,目前功能包括:中国节假日工作日查询和判断.沪深A股交易日历查询,公历农历转化.生肖八字查询等.ChnCal基于chinese_calendar(https://git ...

  4. C#下的一个好用的日历库(sxtwl_cpp),支持农历转公历,和公历转农历等功能

    2019独角兽企业重金招聘Python工程师标准>>> sxtwl_cpp是寿星天文历的C++版本实现.支持多种语言的绑定 代码首页 懒人包 懒人包使用方法 1.右链工程中的引用-& ...

  5. python日历库_python下的一个好用的日历库,支持农历转公历,和公历转农历等功能...

    sxtwl_cpp是寿星天文历的C++版本实现.支持多种语言的绑定. 安装方法 pip install sxtwl windows下的二进制安装包: 传送门 # -*- coding:utf-8 -* ...

  6. lunar.js 基本使用学习笔记

    文章目录 lunar 基本使用学习笔记 介绍 基本使用 部分文档 API 转载 阳历相关的方法 API Solar 阳历 阳历实例化 阳历对象可以使用多种字符串输出方式: 获取年.月.日 儒略日 获取 ...

  7. 很好的阻止了事件的发生_请定好您的闹钟,八月,夜空中将发生这13件超酷的天文事件...

    经过了史诗般漫长的七月,紧跟而来的八月带来了一系列有趣的天文事件.这个月的天文事件表中包含有四颗行星的接近,三场流星雨和一颗小行星.注意了,为了能最后再看一眼彗星"NEOWISE" ...

  8. 大一上:英语复习:Word in use(新视野大学英语读写教程1:第一、三、四、六单元翻译+注释)【四大人工智能翻译辅助系统助力翻译更准确】

    文档下载地址:https://pan.baidu.com/s/1qYDT6rU Word  in  use Unit  1 A 1.Given  the  chance to  show  his  ...

  9. #第五章“拷问”既往的股市理论5.1有人情味的“拷问”

    让谁说自己的短处,都不喜欢说,这是人情世故.所以只能上刑"拷问"了.特别是这些都是股市的老前辈,功成名就,况且,我所有的知识还都是从他们那里学来的,然后自己根据股市证据用数学的方法 ...

最新文章

  1. C++11新特性中的匿名函数Lambda表达式的汇编实现分析(二)
  2. python是人工智能最大骗局-培训三个月拿“高薪”?起底人工智能“速成班”忽悠大法...
  3. ie下js不执行的几种可能
  4. CTF基础理论知识02
  5. Tomcat/weblogic session失效时间的几种设置方法
  6. 疯子的算法总结(八) 最短路算法+模板
  7. 为AWT的机器人创建DSL
  8. 前端学习(1181):vue语法模板
  9. 利用MySQL存储过程分割字符串
  10. 二:Java+SpringBoot框架使用(返回cookies信息的get接口开发)
  11. 调试系列1:bugreport源码篇
  12. 老老实实学WCF] 第五篇 再探通信--ClientBase
  13. 1、mysql创建用户和授权总结
  14. 解决网页pdf禁止打印的方案
  15. 撰写测试用例----二维码支付
  16. 苹果手表Apple Watch 无法检查更新 iOS14.5 14.6 14.7
  17. 也谈SAP系统优缺点
  18. Sneaky Sasquatch Mac(捣蛋大脚怪搞怪冒险游戏)
  19. プログラム・ライブラリ
  20. 设计思维应用:与商业模式结合,让创新落地

热门文章

  1. 2021广西省安全员C证考试题库及答案广西三类人员题库安全员
  2. 鲁哇客:超低功耗边缘计算人脸检测方案对比调研
  3. matlab 快速行进法 compile_mex报错
  4. 威胁猎人控诉极验侵权:以客户名义购买后化身二道贩子
  5. oracle查找某一天的数据,oracle统计时间段内每一天的数据(推荐)
  6. boolean mybatis_解决MyBatis返回结果类型为Boolean的问题
  7. Linux常用与不常用端口一览表
  8. Mongodb 查询指定时间范围的数据
  9. IDEA2018编写供应链Day1
  10. linux进程存放 proc,Linux系统下proc目录详解