### Godot version

4.0+

### System information

Windows 11 22H2

### Issue description

The new feature to link components of a vector value in the inspector, so changing them individually maintains a ratio, has a flaw when it comes to zero values. Since you can't use 0 to build a sensible ratio (what's the ratio of 0 / 20 or 12 / 0 / 5?), having any component reach this value results in values not being updated in a sensible manner anymore.

In plain terms, if you set up some ratio, enable linking, and then drag one of the components in the inspector through the value of 0 multiple times, eventually every component will have the same value (sometimes they will have different signs, depending on the exact starting values). It looks like this:

https://github.com/godotengine/godot/assets/11782833/b5c9b04e-0895-465d-8976-0ba2872149c6


https://github.com/godotengine/godot/assets/11782833/35b9d12a-2994-4d53-b297-f1721036d6e0


https://github.com/godotengine/godot/assets/11782833/09de4cce-5012-4f4c-9aeb-bf48f2bf019f


https://github.com/godotengine/godot/assets/11782833/ee5940b9-c2bd-4b3b-a7d7-b86984bc4250

### Steps to reproduce

You can reproduce it with any engine property with linking available, such as position of spatial (2D, 3D) nodes. Here's a short script I used to test all Vector2/3/4 types (relies on changes from https://github.com/godotengine/godot/pull/77135):

```gdscript

@tool
extends Node3D

var my_vector2 : Vector2
var his_vector2i : Vector2i
var your_vector3 : Vector3
var her_vector3i : Vector3i
var their_vector4 : Vector4
var our_vector4i : Vector4i

func _get_property_list() -> Array:
	return [
		{
			"name": "my_vector2",
			"type": TYPE_VECTOR2,
			"hint": PROPERTY_HINT_LINK,
		},
		{
			"name": "his_vector2i",
			"type": TYPE_VECTOR2I,
			"hint": PROPERTY_HINT_LINK,
		},
		{
			"name": "your_vector3",
			"type": TYPE_VECTOR3,
			"hint": PROPERTY_HINT_LINK,
		},
		{
			"name": "her_vector3i",
			"type": TYPE_VECTOR3I,
			"hint": PROPERTY_HINT_LINK,
		},
		{
			"name": "their_vector4",
			"type": TYPE_VECTOR4,
			"hint": PROPERTY_HINT_LINK,
		},
		{
			"name": "our_vector4i",
			"type": TYPE_VECTOR4I,
			"hint": PROPERTY_HINT_LINK,
		},
	]

```

### Minimal reproduction project

See above.
if (linked->is_pressed()) {
		int changed_component = -1;
		for (int i = 0; i < component_count; i++) {
			if (p_name == COMPONENT_LABELS[i]) {
				changed_component = i;
				break;
			}
		}
		DEV_ASSERT(changed_component >= 0);
		for (int i = 0; i < component_count - 1; i++) {
			int slider_idx = (changed_component + 1 + i) % component_count;
			int ratio_idx = changed_component * (component_count - 1) + i;
			spin_sliders[slider_idx]->set_value_no_signal(spin_sliders[changed_component]->get_value() * ratio[ratio_idx]);
		}
	}
	Variant v;
	Callable::CallError cerror;
	Variant::construct(vector_type, v, nullptr, 0, cerror);
	for (int i = 0; i < component_count; i++) {
		if (angle_in_radians) {
			v.set(i, Math::deg_to_rad(spin_sliders[i]->get_value()));
		} else {
			v.set(i, spin_sliders[i]->get_value());
		}
	}
	emit_changed(get_edited_property(), v, linked->is_pressed() ? "" : p_name);
}
void EditorPropertyVectorN::update_property() {