If you don't mind the lack of a built-in graphical interface and you're OK with "computerish" notation, a great completely free option is the Python programming language. You don't have to learn any programming per se to use the interactive interpreter as a scientific calculator with fraction support. You do have to import various modules that are included in the standard library, such as
fractions for fraction support;
decimal for exact decimals; and
statistics for functions beyond simple arithmetic.
Without importing anything, you get basic arithmetic with either fixed-precision floating point numbers (IEEE 64-bit floats) or arbitrary-precision integers.
You can easily download free third-party packages for even more sophisticated functions as well as graphical visualization.
I like using a programming language interpreter for calculations in part because it's easy to assign names to intermediate results (much more powerful than a normal calculator's memory functions), it's easy to repeat and edit input that I've mistyped, and it's easy to write my own customized functions that aren't included with any existing calculator. That last part is heading into real computer programming, which is there if you want it, but which you can ignore if you don't need it.
Here's a sample interactive session. The
>>> is Python's prompt where you type things in. Note that Python uses
# as the comment character, which I've used to annotate some of the lines: