所以我参加了在线Java课程,任务如下:
在这个程序中,我们将通过计算单位圆上的一些重要值来练习使用Math类。从0开始,然后上升 PI / 4弧度(或45度),打印出以下格式的信息。
Radians: (cos, sin)
0.0: 1.0, 0.0
0.79: 0.7, 0.71
1.57: 0.0, 1.0
2.36: -0.71, 0.7
3.14: -1.0, 0.0
3.93: -0.7, -0.71
4.71: 0.0, -1.0
5.5: 0.71, -0.71
提示:您需要使用Math.sin,Math.cos方法 和Math.PI常数! 您还需要从0循环到2 * PI
以下是我提出的建议:
public class UnitCircle extends ConsoleProgram
{
public void run()
{
System.out.println("Radians: (cos, sin)");
for(double count = 0; count <= Math.PI * 2; count += Math.PI / 4)
{
System.out.println(count + ": " + Math.cos(count) + ", " + Math.sin(count));
}
}
}
然而,当我运行它时,这就是我得到的:
Radians: (cos, sin)
0.0: 1.0, 0.0
0.7853981633974483: 0.7071067811865476, 0.7071067811865475
1.5707963267948966: 6.123233995736766E-17, 1.0
2.356194490192345: -0.7071067811865475, 0.7071067811865476
3.141592653589793: -1.0, 1.2246467991473532E-16
3.9269908169872414: -0.7071067811865477, -0.7071067811865475
4.71238898038469: -1.8369701987210297E-16, -1.0
5.497787143782138: 0.7071067811865474, -0.7071067811865477
6.283185307179586: 1.0, -2.4492935982947064E-16
该怎么办?难道我需要将计算限制为舍入到小数点后两位吗?还有什么我做错了?任何帮助将不胜感激。
答案 0 :(得分:0)
最简单的解决方案是使用简单的print语句格式化输出:System.out.format(&#34;%。2f:%。2f,%。2f&#34;);这很简单,可以让你继续前进,但总是要学习格式化数字和机器代表数字的方式!
格式化问题是System.out.println语句中使用的隐式转换过程不符合舍入和间距的目标。我们希望控制该格式化过程以产生更清晰的输出。请注意,通过printf样式截断格式化字符串输出与舍入略有不同。使用像Math.round这样的显式舍入语句或类似NumericFormat或DecimalFormat的类进行舍入。评论已经指出SO对格式化数字的良好参考。在线Oracle文档包含更详细的信息: https://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html
更有趣的问题与机器(和JVM)如何存储和计算数值有关。看一下方法原型; Math.cos和Math.sin方法都返回一个double。这是用于表示数值的Java原始类型之一。机器在数值上表示和执行数学运算并不完美。
Java的双重基于标准(IEEE754),它指定64位的特定用途来表示数字。机器中使用双重浮点数来表示实数(想想连续值,而不仅仅是整数)。很容易观察到64位值不能完美地代表所有实数;有无限数量的实际值,但只有2 ^ 64个唯一的双精度值。浮点数有一个标准,它只使用32位来表示所有实数。这意味着实际值和表示值之间可能存在差异。当以不同方式计算时,可以看到实际上相同的值之间的差异(例如,Math.sin(Math.PI / 4)== Math.cos(Math.PI / 4))。真实值和代表值之间的差异非常小,不会对应用程序产生影响。